将JSON反序列化为对象

8

我有一些JSON:

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

我希望将这个反序列化成一个集合。我已经定义了这个类:

public class Foo
{
    public string bar { get; set; }
}

然而,以下代码无法正常工作:
 JsonConvert.DeserializeObject<List<Foo>>(jsonString);

我该如何反序列化我的JSON?


2
这篇文章旨在作为“为什么反序列化不起作用”的规范问题,并展示人们可以遵循的一般工作流程。欢迎回答、改进并将其用作重复目标。 - CodeCaster
1个回答

23
那个JSON不是一个Foo JSON数组。代码JsonConvert.DeserializeObject<T>(jsonString)将解析JSON字符串从根节点开始,你的类型T必须完全匹配该JSON结构。解析器不会猜测哪个JSON成员应该代表你正在寻找的List<Foo>
你需要一个表示从根元素开始的JSON的根对象。
你可以很容易地让类从样本JSON中生成。要做到这一点,请复制你的JSON并在Visual Studio中单击Edit -> Paste Special -> 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中找不到“特殊粘贴”选项,但提供的链接解决了问题。哇。真希望早些知道这个网站。谢谢! - err1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接