JsonSerializer 不反序列化任何集合,但反序列化对象的所有其余部分
JsonSerializer dosen't deserialize any collection but deserializes all the rest of the object
假设我有一个包含以下 JSON 数据的数组:
[
{
"foo": "somestring",
"foo1": 2,
"foo2": [
"somestring1",
"somestring2"
],
"foo3": [
{
"bar1": 122312,
"bar2": 3214324
},
{
"bar3": 432432432,
"bar4": 4324231
}
]
},
//more root array members...
]
我为要反序列化的 JSON 创建了以下 类:
internal class StoredFoo
{
[JsonPropertyName("foo")]
public string Foo
{
get; set;
}
[JsonPropertyName("foo1")]
public double Foo1
{
get; set;
}
[JsonPropertyName("foo2")]
public List<string> Foo2 { get; } = new List<string>();
[JsonPropertyName("foo3")]
public List<StoredBar> Foo3 { get; } = new List<StoredBar>();
}
internal class StoredBar
{
[JsonPropertyName("bar1")]
public long Bar1
{
get; set;
}
[JsonPropertyName("bar2")]
public long Bar2
{
get; set;
}
}
(无法使用实名表示歉意,部分项目限制)
当我加载 JSON 文件并反序列化它时:
string jsonFooData = File.ReadAllText(filePath);
IEnumerable<Foo> storedFoos = JsonSerializer.Deserialize<IEnumerable<Foo>>(jsonFooData);
然后 storedFoos
包含对象,但是 Foo2
和 Foo3
是空的,即使它们不应该是空的。
起初,我认为这是因为 = new List<string>()
以某种方式发生在 JsonSerializer
初始化集合之后,有效地覆盖了它。但即使删除 = new List<string>()
语句,集合也只是设置为 null
(无一例外)。
为什么 JsonSerializer
成功反序列化为 foo
和 foo1
而不是 foo2
和 foo3
?
正如@zaitsman 所建议的,我们可以将属性更改为可变的。
如果我们想要填充只读属性,我们可以使用 public 构造函数。
public class StoredFoo
{
[JsonPropertyName("foo")]
public string Foo { get; set; }
[JsonPropertyName("foo1")]
public double Foo1 { get; set; }
[JsonPropertyName("foo2")]
public List<string> Foo2 { get; } = new List<string>();
[JsonPropertyName("foo3")]
public List<StoredBar> Foo3 { get; } = new List<StoredBar>();
public StoredFoo(string foo, double foo1, List<string> foo2, List<StoredBar> foo3)
=> (Foo, Foo1, Foo2, Foo3) = (foo, foo1, foo2, foo3);
}
如果有多个构造函数,请使用 JsonConstructor
属性定义要使用的构造函数。
假设我有一个包含以下 JSON 数据的数组:
[
{
"foo": "somestring",
"foo1": 2,
"foo2": [
"somestring1",
"somestring2"
],
"foo3": [
{
"bar1": 122312,
"bar2": 3214324
},
{
"bar3": 432432432,
"bar4": 4324231
}
]
},
//more root array members...
]
我为要反序列化的 JSON 创建了以下 类:
internal class StoredFoo
{
[JsonPropertyName("foo")]
public string Foo
{
get; set;
}
[JsonPropertyName("foo1")]
public double Foo1
{
get; set;
}
[JsonPropertyName("foo2")]
public List<string> Foo2 { get; } = new List<string>();
[JsonPropertyName("foo3")]
public List<StoredBar> Foo3 { get; } = new List<StoredBar>();
}
internal class StoredBar
{
[JsonPropertyName("bar1")]
public long Bar1
{
get; set;
}
[JsonPropertyName("bar2")]
public long Bar2
{
get; set;
}
}
(无法使用实名表示歉意,部分项目限制)
当我加载 JSON 文件并反序列化它时:
string jsonFooData = File.ReadAllText(filePath);
IEnumerable<Foo> storedFoos = JsonSerializer.Deserialize<IEnumerable<Foo>>(jsonFooData);
然后 storedFoos
包含对象,但是 Foo2
和 Foo3
是空的,即使它们不应该是空的。
起初,我认为这是因为 = new List<string>()
以某种方式发生在 JsonSerializer
初始化集合之后,有效地覆盖了它。但即使删除 = new List<string>()
语句,集合也只是设置为 null
(无一例外)。
为什么 JsonSerializer
成功反序列化为 foo
和 foo1
而不是 foo2
和 foo3
?
正如@zaitsman 所建议的,我们可以将属性更改为可变的。
如果我们想要填充只读属性,我们可以使用 public 构造函数。
public class StoredFoo
{
[JsonPropertyName("foo")]
public string Foo { get; set; }
[JsonPropertyName("foo1")]
public double Foo1 { get; set; }
[JsonPropertyName("foo2")]
public List<string> Foo2 { get; } = new List<string>();
[JsonPropertyName("foo3")]
public List<StoredBar> Foo3 { get; } = new List<StoredBar>();
public StoredFoo(string foo, double foo1, List<string> foo2, List<StoredBar> foo3)
=> (Foo, Foo1, Foo2, Foo3) = (foo, foo1, foo2, foo3);
}
如果有多个构造函数,请使用 JsonConstructor
属性定义要使用的构造函数。