已关闭,此问题需要details or clarity。目前不接受答复。
**想改善这个问题吗?**通过editing this post添加详细信息并澄清问题。
class MyClass
{
public List<MyClass2> MyList { get; set; }
public MyClass2 MyElement
{
get
{
return this.MyList != null && this.MyList.Any() ? this.MyList[0] : null;
}
}
}
class MyClass2
{
public List<int> SomeList { get; set; }
}
var str = "{ \"myList\": [{\"someList\":[1,2]}], \"myElement\": {\"someList\":[1,2]} }";
var obj = Newtonsoft.Json.JsonConvert.DeserializeObject<MyClass>(str);
在上面C#代码中,为什么Newtonsoft JSON Deserializer自动将obj.MyList[0].SomeList设置为[1,2,1,2]而不是[1,2]?
注意:设置ObjectCreationHandling = ObjectCreationHandling就可以了,替换
这是我认为的解决方案,但不确定为什么Newtonsoft JSON Deserializer的默认行为(ObjectCreationHandling.Auto)是这样的。
1条答案
按热度按时间woobm2wo1#
我认为这是因为Json.Net(Newtonsoft.JSON)的默认行为是向现有集合添加项,而不是替换它。
所以当MyClass被反序列化时,它创建了一个MyClass的新示例,MyList设置为空列表。当反序列化器遇到JSON字符串中的第一个对象(MyList属性)时,它会将MyClass2的新示例添加到MyList。然后将该示例的SomeList属性设置为[1,2]。
然后,反序列化器遇到JSON字符串中的第二个对象(MyClass的MyElement属性)。现在MyList属性已经有一个MyClass2对象,其中SomeList设置为[1,2],反序列化器添加该示例的SomeList属性,其值为[3,4],并设置为[1,2,3,4]
现在,如果我们想替换现有的列表而不是添加到列表中,我们可以设置ObjectCreationHandling = ObjectCreationHandling.Replace,然后反序列化器将创建集合类型的新示例,并用它替换现有示例。