我有一些JSON:
{
"foo" : [
{ "bar" : "baz" },
{ "bar" : "qux" }
]
}
Run Code Online (Sandbox Code Playgroud)
我想将其反序列化为一个集合.我已经定义了这个类:
public class Foo
{
public string bar { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
但是,以下代码不起作用:
JsonConvert.DeserializeObject<List<Foo>>(jsonString);
Run Code Online (Sandbox Code Playgroud)
如何反序列化我的JSON?
Cod*_*ter 21
那个JSON不是FooJSON数组.代码JsonConvert.DeserializeObject<T>(jsonString)将从根向上解析JSON字符串,并且您的类型T必须与该JSON结构完全匹配.解析器不会猜测哪个 JSON成员应该代表List<Foo>您正在寻找的.
您需要一个根对象,它表示根元素中的JSON.
您可以轻松地让类通过示例JSON生成.为此,请复制JSON并单击Edit -> Paste Special -> Paste JSON As ClassesVisual Studio.
或者,你可以在http://json2csharp.com上做同样的事情,它会生成或多或少相同的类.
您会看到该集合实际上是一个比预期更深的元素:
public class Foo
{
public string bar { get; set; }
}
public class RootObject
{
public List<Foo> foo { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在,您可以从根目录反序列化JSON(并确保重命名RootObject为有用的东西):
var rootObject = JsonConvert.DeserializeObject<RootObject>(jsonString);
Run Code Online (Sandbox Code Playgroud)
并访问该集合:
foreach (var foo in rootObject.foo)
{
// foo is a `Foo`
}
Run Code Online (Sandbox Code Playgroud)
您始终可以重命名属性以遵循约束约定并将JsonProperty属性应用于它们:
public class Foo
{
[JsonProperty("bar")]
public string Bar { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
还要确保JSON包含足够的样本数据.类解析器必须根据JSON中找到的内容猜测适当的C#类型.
| 归档时间: |
|
| 查看次数: |
14683 次 |
| 最近记录: |