Newtonsoft.JSON: JSON列表和JSON数组的处理方式不同

本文关键字:JSON 处理 方式不 列表 Newtonsoft 数组 | 更新日期: 2023-09-27 18:12:25

给定以下代码:

public class ColorList 
{
    public List<string> Colors = new List<string>(new string[1] { "#eeeeee"});
}
public class ColorArray 
{
    public string[] Colors = new string[1] { "#eeeeee"};
}
public class Program
{
    public static void Main()
    {
        string json = "{Colors:['#abc','#123']}";
        // Deserialize Colors into List:
        Console.WriteLine(JsonConvert.DeserializeObject<ColorList>(json).Colors.Count);
        // returns 3
        // Deserialize Colors into Array:
        Console.WriteLine(JsonConvert.DeserializeObject<ColorArray>(json).Colors.Length);
        // returns 2
    }
}

为什么这两种反序列化有区别?

Newtonsoft.JSON: JSON列表和JSON数组的处理方式不同

除了Jon Skeet的评论,我还想补充一点,您可以部分地控制这种行为:

var settings = new JsonSerializerSettings() {
     ObjectCreationHandling = ObjectCreationHandling.Replace
};
Console.WriteLine(JsonConvert.DeserializeObject<ColorList>(json, settings).Colors.Count); // returns 2, because list was replaced, not reused

然而,即使你将ObjectCreationHandling.Reuse与array一起使用,它也不会重用它,但仍然会替换(好吧,它无论如何都不能真正重用它)。

既然你写了在反序列化时期望有新的集合-这可能对你有帮助。