从 JSON 字符串到字典的简单解析器

Posted

技术标签:

【中文标题】从 JSON 字符串到字典的简单解析器【英文标题】:A simple parser from JSON string to Dictionary 【发布时间】:2017-04-16 22:01:22 【问题描述】:

我想避免导入庞大的库来获得完整的 JSON 支持。

我的用例非常简单:我需要一个解析器来处理 JSON 的一种特定情况,其中键和值都是字符串,即。 "name": "David" 。没有嵌套,没有数组,没有对象序列化。

原因是,我只将 JSON 用于 i18n,并且我将我的翻译文件构建为平面 JSON。

手动滚动我自己的解析器是个好主意吗? 已经有一个了吗? 我的问题有更简单的解决方案吗?

编辑:是的,我知道 JSON.net 是 .NET 的实际解决方案,但它不是 Unity 的解决方案(不是本机的)。我真的只需要它的一小部分力量。

【问题讨论】:

注意:但我确实想要不需要为我的 JSON 对象编写类的灵活性,这就是为什么我选择 Dictionary 作为我想要的输出。 How can I deserialize JSON to a simple Dictionary<string,string> in ASP.NET?的可能重复 @bansi 您能否指出哪个答案适用于我的问题?尤其是知道 JSON.net 本身并不支持 Unity。 @bansi 这是一种重复但不准确,因为建议的答案是 OP 不想要的 JSON.Net。 如果你想要only a tiny portion of its power,你最好手动滚动解析器。所有通用解决方案都试图寻求一个完整的解决方案。 【参考方案1】:

System.Json 可能会为您解决问题。

JsonValue.Parse()方法解析JSON文本并返回JsonValuelike

JsonValue value = JsonValue.Parse(@" ""name"": ""David"" ");

您还可以查看 javascriptSerializer 类在内部被异步通信层用来序列化和反序列化在浏览器和 Web 服务器之间传递的数据。

var Names = new JavaScriptSerializer().Deserialize<YourNameClass>(json);

【讨论】:

你说得对,JsonValue 对于我的情况来说已经足够接近了,请查看这个 SO 问题以更完整地使用 JsonValue:***.com/questions/9573119/… 哦等等,除了 Unity 没有 System.Json 命名空间,因为它是 .Net 3.0-ish... 是的,它是在 4.5 中引入的【参考方案2】:

好的,我找到了! https://github.com/zanders3/json

进行了不错的测试,功能最少,并且可能专为我的特定用例而设计。

加载 JSON 文件:

Dictionary<string, object> locales = new Dictionary<string, object>();

TextAsset file = Resources.Load(name) as TextAsset;
var locale = file.text.FromJson<object>();
locales.Add(name, locale);

使用 JSON 字典:

string activeLocale = "en-US";
var locale = locales[activeLocale] as Dictionary<string, object>;
var translation = locale[key] as string;

很简单。

【讨论】:

以上是关于从 JSON 字符串到字典的简单解析器的主要内容,如果未能解决你的问题,请参考以下文章

一个简单的json解析器

面试题|手写JSON解析器

json解析报错 Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

在 BigQuery 中加载 JSON / JSON 在从位置开始的行中解析错误 ...:解析器在字符串结束之前终止

Python Json加载()返回字符串而不是字典?

从 json 解析返回的数据排序与 json 字符串不同