.NET 4.6类库中嵌入JSON转JObject报错的原生解决方法
解决嵌入JSON文件解析为JObject的问题
这个问题我之前碰到过,根源是你通过Resources.resx添加JSON文件时,Visual Studio自动把JSON内容转义成了字符串字面量,导致读出来的不是原始的JSON结构,而是带首尾引号和转义斜杠的包装字符串,自然会让JObject.Parse报错。
推荐的原生解决方案:直接将JSON文件设为嵌入资源
不要通过Resources.resx管理JSON文件,而是直接操作嵌入资源:
设置文件属性:
- 在解决方案资源管理器中选中你的
test.json文件 - 右键→属性,将生成操作改为
嵌入的资源
- 在解决方案资源管理器中选中你的
读取并解析JSON:
使用程序集的GetManifestResourceStream方法读取原始的JSON内容,这样就能拿到未被转义的纯JSON字符串:using System.IO; using System.Reflection; using Newtonsoft.Json.Linq; // 获取当前类库的程序集 var currentAssembly = Assembly.GetExecutingAssembly(); // 资源名称格式:你的类库命名空间 + 文件路径(如果有子文件夹) + 文件名 // 比如你的类库命名空间是MyClassLibrary,文件在根目录,那就是"MyClassLibrary.test.json" var resourceFullName = "YourClassLibraryNamespace.test.json"; using (var resourceStream = currentAssembly.GetManifestResourceStream(resourceFullName)) using (var streamReader = new StreamReader(resourceStream)) { string rawJson = streamReader.ReadToEnd(); JObject jsonObject = JObject.Parse(rawJson); // 这里就可以正常使用jsonObject了 }验证资源名称:
如果不确定资源的完整名称,可以用下面的代码列出所有嵌入资源,找到你要的那个:var allResources = Assembly.GetExecutingAssembly().GetManifestResourceNames(); foreach (var name in allResources) { Console.WriteLine(name); }
为什么原来的方法不行?
当你把JSON文件添加到Resources.resx时,Visual Studio会把它当作字符串资源处理,自动对内容中的特殊字符(比如双引号)进行转义,最终生成的资源内容就是带首尾引号的转义字符串,相当于你手动写了一个包含JSON的字符串字面量,而不是原始的JSON数据。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

