将 JSON 反序列化为对象

Posted

技术标签:

【中文标题】将 JSON 反序列化为对象【英文标题】:Deserializing JSON into an object 【发布时间】:2016-03-17 07:26:47 【问题描述】:

我有一些 JSON:


    "foo" : [ 
         "bar" : "baz" ,
         "bar" : "qux" 
    ]

我想将其反序列化为一个集合。我已经定义了这个类:

public class Foo

    public string bar  get; set; 

但是,下面的代码不起作用:

 JsonConvert.DeserializeObject<List<Foo>>(jsonString);

如何反序列化我的 JSON?

【问题讨论】:

这是“为什么这种反序列化不起作用”的规范问题,应该显示人们可以遵循的一般工作流程。随意回答、改进和用作重复目标。 【参考方案1】:

那个 JSON 不是 Foo JSON 数组。代码JsonConvert.DeserializeObject&lt;T&gt;(jsonString) 将解析JSON 字符串从根向上,您的类型T 必须与该JSON 结构完全匹配。解析器不会猜测 哪个 JSON 成员应该代表您正在寻找的 List&lt;Foo&gt;

您需要一个根对象,它表示来自根元素的 JSON。

您可以轻松地让执行此操作的类从示例 JSON 生成。为此,请复制您的 JSON 并在 Visual Studio 中单击 Edit -&gt; Paste Special -&gt; Paste JSON As Classes

或者,您可以在 http://json2csharp.com 上执行相同的操作,这会生成或多或少相同的类。

您会看到集合实际上比预期的要深一个元素:

public class Foo

    public string bar  get; set; 


public class RootObject

    public List<Foo> foo  get; set; 

现在您可以从根目录反序列化 JSON(并确保将 RootObject 重命名为有用的名称):

var rootObject = JsonConvert.DeserializeObject<RootObject>(jsonString);

并访问集合:

foreach (var foo in rootObject.foo)

    // foo is a `Foo`


您始终可以重命名属性以遵循您的大小写约定并为它们应用JsonProperty 属性:

public class Foo

    [JsonProperty("bar")]
    public string Bar  get; set; 

还要确保 JSON 包含足够的示例数据。类解析器必须根据 JSON 中的内容猜测适当的 C# 类型。

【讨论】:

谢谢@CodeCaster。虽然我在 VS2010 和 VS2017 中都找不到粘贴特殊选项,但提供的链接完成了这项工作。哇。希望我早点知道这个网站。谢谢!

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

将 JSON 反序列化为现有对象 (Java)

将 JSON 反序列化为匿名对象

将JSON对象反序列化为嵌套的C#对象

将 PHP 对象图序列化/反序列化为 JSON

使用 Json.net 将 JSON 对象反序列化为动态对象

将 Objective-C 对象序列化和反序列化为 JSON