Newtonsoft JSON 反序列化

Posted

技术标签:

【中文标题】Newtonsoft JSON 反序列化【英文标题】:Newtonsoft JSON Deserialize 【发布时间】:2013-06-06 23:45:39 【问题描述】:

我的 JSON 如下:

"t":"1339886","a":true,"data":[],"Type":[['Ants','Biz','Tro']]

我找到了用于 C# 的 Newtonsoft JSON.NET 反序列化库。我尝试按如下方式使用它:

object JsonDe = JsonConvert.DeserializeObject(Json); 

如何访问JsonDe 对象以获取所有“类型”数据?我用循环尝试了它,但它不起作用,因为该对象没有枚举器。

【问题讨论】:

Using JsonConvert.DeserializeObject to deserialize Json to a C# POCO class 的可能重复项 你应该看看这个问题的答案:***.com/questions/11126242/… 【参考方案1】:

您可以实现一个类来保存 JSON 中的字段

class MyData

    public string t;
    public bool a;
    public object[] data;
    public string[][] type;

然后使用 DeserializeObject 的通用版本:

MyData tmp = JsonConvert.DeserializeObject<MyData>(json);
foreach (string typeStr in tmp.type[0])

    // Do something with typeStr

文档:Serializing and Deserializing JSON

【讨论】:

我刚刚添加了一个应该有用的示例。为什么“类型”是列表列表(数组数组)对我来说是个谜——但这应该与您提供的 json 字符串保持一致。 非常感谢您的回答。它帮助我解决了我的问题:) 我使用的演员阵容失败了 MyData tmp = (MyData)JsonConvert.DeserializeObject(json);。反序列化的通用版本效果更好,谢谢。 :-) 好的,我写在这里:dotnet add package Newtonsoft.Jsonusing Newtonsoft.Json;【参考方案2】:

更简单的解决方案:使用动态类型

从 Json.NET 4.0 Release 1 开始,有原生的 dynamic 支持。 您不需要声明一个类,只需使用dynamic

dynamic jsonDe = JsonConvert.DeserializeObject(json);

所有字段都将可用:

foreach (string typeStr in jsonDe.Type[0])

    // Do something with typeStr
 

string t = jsonDe.t;
bool a = jsonDe.a;
object[] data = jsonDe.data;
string[][] type = jsonDe.Type;

使用dynamic,您无需创建特定的类来保存您的数据。

【讨论】:

不错的答案,感谢您向我介绍dynamic :) 绝对简单。但它的缺点是无法轻松检查属性是否存在(您应该使用异常处理)。 @Jowen 要检查属性是否存在而不进行异常处理,请查看those answers 非常感谢1!!我一直在寻找最简单的解决方案【参考方案3】:

根据Newtonsoft Documentation,您还可以像这样反序列化为匿名对象:

var definition = new  Name = "" ;

string json1 = @"'Name':'James'";
var customer1 = JsonConvert.DeserializeAnonymousType(json1, definition);

Console.WriteLine(customer1.Name);
// James

【讨论】:

现在这很聪明! ;-) 但是当定义不像你的例子那么简单时,它就会变得笨拙。 我对@9​​87654323@一无所知,在这种情况下我应该如何使用DeserializeAnonymousType 这是一个毫无价值的例子,因为大多数 JSON 并没有那么简单。我希望看到一个更类似于具有嵌套属性的 JSON 字符串的定义...【参考方案4】:
//Your snippet
object JsonDe = JsonConvert.DeserializeObject(Json);

//what you need to do
JObject JsonDe = JsonConvert.DeserializeObject<JObject>(Json);

现在您已经拥有和对象具有合适的属性和方法来处理数据。

您也可以使用 Dictionary 代替 JObject。但是,还有其他替代方案,不过是强类型。

NewtonSoft.Json 是一个优秀的库。我已经将它用于许多用例。

json 的美妙之处在于可以动态创建模式。因此,我们需要能够编写通用代码来使用它们

【讨论】:

以上是关于Newtonsoft JSON 反序列化的主要内容,如果未能解决你的问题,请参考以下文章

反序列化时的 Newtonsoft.JSON 空值

Newtonsoft.Json 处理多态类型的反序列化

使用Newtonsoft.Json.dll序列化和反序列化

如何通过NewtonSoft反序列化对象json列表?

使用 Newtonsoft Json 从流中反序列化多个 json 对象

Newtonsoft JSON 反序列化