我正在使用 JSON.Net 来反序列化JSON字符串。JSON 字符串是
string testJson = @"{
""Fruits"": {
""Apple"": {
""color"": ""red"",
""size"": ""round""
},
""Orange"": {
""Properties"": {
""color"": ""red"",
""size"": ""round""
}
}
}
}";
我的代码是
public class Fruits
{
public Apple apple { get; set; }
public Orange orange { get; set; }
}
public class Apple
{
public string color { get; set; }
public string size { get; set; }
}
public class Orange
{
public Properties properties { get; set; }
}
public class Properties
{
public string color { get; set; }
public string size { get; set; }
}
我正在尝试使用以下代码反序列化它
Fruits result = JsonConvert.DeserializeObject<Fruits>(testJson);
我的结果有一个问题,苹果和橙子的水果有null
而不是它们的属性、颜色、大小。
假设您无法更改 json,您需要创建一个具有 Fruits
属性的新FruitsWrapper
类
public class FruitsWrapper
{
public Fruits Fruits { get; set; }
}
并将 JSON 反序列化为 FruitsWrapper
的实例,而不是Fruits
FruitsWrapper result = JsonConvert.DeserializeObject<FruitsWrapper>(testJson);
工作演示:https://dotnetfiddle.net/nQitSD
问题是 Json 中最外层的护腕对应于您尝试反序列化的类型。
所以这个:
string testJson = @"{
""Fruits"": { ... }
}";
对应于水果,因为这是您要反序列化的内容。
string testJson = @"{
""Fruits"": { ... }
^--+-^
|
+-- this is assumed to be a property of this --+
|
+------------------------+
|
v--+-v
Fruits result = JsonConvert.DeserializeObject<Fruits>(testJson);
但是,Fruits
类型没有名为 Fruits
的属性,因此不会反序列化任何内容。
如果无法更改 Json,则需要创建一个反序列化的容器类型,如下所示:
public class Container
{
public Fruits Fruits { get; set; }
}
然后你可以反序列化它:
Container result = JsonConvert.DeserializeObject<Container>(testJson);
JSON 字符串应为:
string testJson = @"{
""Apple"": {
""color"": ""red"",
""size"": ""round""},
""Orange"": {
""Properties"": {
""color"": ""red"",
""size"": ""round"" }
}
}";
使用类进行反序列化
您的 JSON 字符串不正确(正如其他人指出的那样),但我添加它是为了帮助您找到正确的格式。假设您有一个像这样的fruit
对象:
var fruit = new Fruits
{
apple = new Apple { color = "red", size = "massive" },
orange = new Orange { properties = new Properties { color = "orange", size = "mediumish" } }
};
然后,您可以将其序列化为 JSON:
var testJson = JsonConvert.SerializeObject(fruit);
现在你可以看到序列化的输出将如下所示:(略微格式化)
{"apple":
{"color":"red","size":"massive"},
"orange":
{"properties":
{"color":"orange","size":"mediumish"}}}
这将很容易反序列化回您的对象:
fruit = JsonConvert.DeserializeObject<Fruits>(testJson);