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

时间:2016-10-10 14:35:22

标签: c# json json.net

给出以下代码:

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
    }
}

为什么两个反序列化之间存在差异?

1 个答案:

答案 0 :(得分:3)

除了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与数组一起使用 - 它也不会重复使用它,但仍会替换它(无论如何它都无法真正重用它)。

由于您写道,在反序列化时您会期望新的集合 - 这可能对您有帮助。