给定以下代码:
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
}
}
为什么这两种反序列化有区别?
除了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一起使用,它也不会重用它,但仍然会替换(好吧,它无论如何都不能真正重用它)。
既然你写了在反序列化时期望有新的集合-这可能对你有帮助。