Newtonsoft JSON反序列化

abc*_*cba 78 c# json.net deserialization

我的JSON如下:

{"t":"1339886","a":true,"data":[],"Type":[['Ants','Biz','Tro']]}
Run Code Online (Sandbox Code Playgroud)

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

object JsonDe = JsonConvert.DeserializeObject(Json); 
Run Code Online (Sandbox Code Playgroud)

如何访问该JsonDe对象以获取所有"类型"数据?我尝试了一个循环,但它没有工作,因为该对象没有枚举器.

Mic*_*zon 129

您可以实现一个包含JSON中包含的字段的类

class MyData
{
    public string t;
    public bool a;
    public object[] data;
    public string[][] type;
}
Run Code Online (Sandbox Code Playgroud)

然后使用DeserializeObject的通用版本:

MyData tmp = JsonConvert.DeserializeObject<MyData>(json);
foreach (string typeStr in tmp.type[0])
{
    // Do something with typeStr
}
Run Code Online (Sandbox Code Playgroud)

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


Yve*_* M. 78

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

从Json.NET 4.0 Release 1开始,就有本机动态支持.你不需要声明一个类,只需使用dynamic:

dynamic jsonDe = JsonConvert.DeserializeObject(json);
Run Code Online (Sandbox Code Playgroud)

所有字段都将可用:

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;
Run Code Online (Sandbox Code Playgroud)

使用动态,您无需创建特定的类来保存数据.

  • 很好的回答,谢谢你把我介绍给`dynamic` :) (10认同)
  • 绝对容易。但这具有无法轻松检查属性是否存在的缺点(您应该使用异常处理)。 (2认同)
  • @Jowen要检查是否存在没有异常处理的属性,请查看[这些答案](http://stackoverflow.com/questions/2839598/how-to-detect-if-a-property-exists-on-a- C中的动态对象) (2认同)

Som*_*gOn 8

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

var definition = new { Name = "" };

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

Console.WriteLine(customer1.Name);
// James
Run Code Online (Sandbox Code Playgroud)