给出以下代码:
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
}
}
为什么两个反序列化之间存在差异?
答案 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
与数组一起使用 - 它也不会重复使用它,但仍会替换它(无论如何它都无法真正重用它)。
由于您写道,在反序列化时您会期望新的集合 - 这可能对您有帮助。