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 包含对象,但是 Foo2Foo3 是空的,即使它们不应该是空的。

起初,我认为这是因为 = new List<string>() 以某种方式发生在 JsonSerializer 初始化集合之后,有效地覆盖了它。但即使删除 = new List<string>() 语句,集合也只是设置为 null (无一例外)。

为什么 JsonSerializer 成功反序列化为 foofoo1 而不是 foo2foo3

正如@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 属性定义要使用的构造函数。