【问题标题】:Newtonsoft JSON DeserializeNewtonsoft JSON 反序列化
【发布时间】: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 对象以获取所有“类型”数据?我用循环尝试了它,但它不起作用,因为该对象没有枚举器。

【问题讨论】:

标签: c# json.net deserialization


【解决方案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 的美妙之处在于可以动态创建模式。因此,我们需要能够编写通用代码来使用它们

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多