Newtonsoft JSON反序列化


83

我的JSON如下:

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

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

object JsonDe = JsonConvert.DeserializeObject(Json); 

如何访问JsonDe对象以获取所有“类型”数据?我尝试了一个循环,但由于对象没有枚举器而无法正常工作。



你应该看看这个问题的答案:stackoverflow.com/questions/11126242/...
迪茨

Answers:


133

您可以实现一个类,该类保存您的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
}

文档:序列化和反序列化JSON


我只是添加了一个应该有用的示例。为什么“类型”是列表列表(数组数组)对我来说还是一个谜,但这应该与您提供的json字符串对齐。
Michael Banzon 2013年

1
非常感谢您的回答。它帮助我解决了问题:)
santosh kumar patro

我正在使用失败的演员表MyData tmp = (MyData)JsonConvert.DeserializeObject(json);。谢谢,通用版本的反序列化效果更好。:-)
SharpC

好的,我在这里写:dotnet add package Newtonsoft.Jsonusing Newtonsoft.Json;
丹妮·埃雷拉

80

一个简单得多的解决方案:使用动态类型

从Json.NET 4.0 Release 1开始,提供了本机动态支持。您无需声明类,只需使用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,您无需创建特定的类来保存数据。


10
漂亮的答案,感谢向我介绍了dynamic:)
maialithar

2
绝对容易。但这具有无法轻松检查属性是否存在的缺点(您应该使用异常处理)。
乔文2014年

2
@Jowen要检查是否存在没有异常处理的属性,请查看这些答案
Yves

非常感谢你1!最简单的解决方案香港专业教育学院一直在寻找这么长时间
Sly_TheKing

9

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

var definition = new { Name = "" };

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

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

现在很聪明!;-)但是,如果定义不像您的示例那样简单明了,它就会变得笨拙。
Sнаđошƒаӽ

我一无所知definitionDeserializeAnonymousType在这种情况下该如何使用?
Mehdi Dehghani

这是一个毫无用处的示例,因为大多数JSON都没有这么简单。我想看到一个更类似于具有嵌套属性的JSON字符串的定义...
pmfith
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.