将JSON反序列化为对象

9

我正在将一个JSON字符串反序列化为一个对象。由于里面的JSON比较复杂,因此我不能使用Dictionary<string, string>。我知道有Dictionary<string, dynamic>这个类型,但是我在.NET 3.5框架下工作,所以无法使用dynamic

所以我最终选择了如下方案:

object json = new JavaScriptSerializer().Deserialize<object>("myjson");

但我没有找到不用反射就能访问 json 的方法。有什么建议吗?

我对这个领域不是很熟悉,所以如果这是一个愚蠢的问题,我很抱歉...但为什么不能使用反射来访问json.html - Kiley Naro
1
我可以使用反射,但我认为如果你发现自己在处理一些琐碎的事情时需要使用反射,那么你可能做错了什么。在这种情况下,我认为我不需要使用它。 - user989818
3个回答

13

我会使用ServiceStack.Text并使用JsonObject.Parse解析它。

然后,您将获得易于阅读的数据字典。

ServiceStack比Json.NET更快、更好。


10

这可以使用ServiceStack的JsonSerializer很容易地完成:

var dictionary = JsonSerializer.DeserializeFromString<Dictionary<string,string>>(myJson);

如果使用扩展方法,则更加简洁:

var dictionary = myJson.FromJson<Dictionary<string,string>>();

否则,如果您愿意,可以使用动态API:

var jsonObj = JsonObject.Parse(myJson);
var value = jsonObj.Get("key");

以下是几个真实世界的用例,展示了反序列化动态 JSON 负载的不同方式:

额外奉上使用.NET 最快的 JSON 序列化器 :)

ServiceStack 的 Json 序列化器也可通过 NuGet 下载:

PM> Install-Package ServiceStack.Text

嗨Demis, 我有几个问题
  1. 解析大型json文件是否有流式Json解析选项可用?
  2. 当Json嵌入在方括号[]中时,解析失败是否有任何可用的方法来覆盖它?
- Gokul
  1. 不。
  2. 我不理解这个例子,但所有可用的解析钩子和自定义选项都在 JsConfigJsConfig<T> 上。
- mythz
谢谢你,Demis。我在尝试解析出现以下错误:“SerializationException: 类型定义应该以'{'开头,期望序列化类型'RootObject',但得到的是以]开头的字符串。” 链接在此。当我删除文件中的第一个字符[和最后一个字符]时,就可以成功解析了。 - Gokul

1

JSON.NET 是一款广受欢迎的 JSON 序列化库,它允许您将已定义类型的对象 序列化/反序列化 为 JSON,并通过JObject获得元结构的类型化表示(当您不知道 JSON 的结构时)。

我发现它比 .NET 自带的 JSON 操作更好用,这种情况在很多时候都出现过。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接