C# Newtonsoft JSON Deserializer在使用getter属性时合并列表元素[关闭]

fivyi3re  于 2023-06-07  发布在  C#
关注(0)|答案(1)|浏览(204)

已关闭,此问题需要details or clarity。目前不接受答复。
**想改善这个问题吗?**通过editing this post添加详细信息并澄清问题。

6天前关闭
Improve this question

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)是这样的。

woobm2wo

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,然后反序列化器将创建集合类型的新示例,并用它替换现有示例。

相关问题