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.Json
和using 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
【讨论】:
现在这很聪明! ;-) 但是当定义不像你的例子那么简单时,它就会变得笨拙。 我对@987654323@一无所知,在这种情况下我应该如何使用DeserializeAnonymousType
?
这是一个毫无价值的例子,因为大多数 JSON 并没有那么简单。我希望看到一个更类似于具有嵌套属性的 JSON 字符串的定义...【参考方案4】:
//Your snippet
object JsonDe = JsonConvert.DeserializeObject(Json);
//what you need to do
JObject JsonDe = JsonConvert.DeserializeObject<JObject>(Json);
现在您已经拥有和对象具有合适的属性和方法来处理数据。
您也可以使用 Dictionary
NewtonSoft.Json 是一个优秀的库。我已经将它用于许多用例。
json 的美妙之处在于可以动态创建模式。因此,我们需要能够编写通用代码来使用它们
【讨论】:
以上是关于Newtonsoft JSON 反序列化的主要内容,如果未能解决你的问题,请参考以下文章