【问题标题】:How to avoid JsonConvert.PopulateObject enqueue on lists [duplicate]如何避免列表中的 JsonConvert.PopulateObject 入队 [重复]
【发布时间】:2021-08-05 02:10:06
【问题描述】:

我有这个愚蠢的课程:

public class Person
{
public string Name { get; set; }
public string Surname { get; set; }
public int Age { get; set; }
public List<int> NumbersList { get; set; }
}

我有这两个 json(第二个来自条件序列化槽 ShouldSerialize)

var json1 = "{\"Name\":\"Joe\",\"Surname\":\"Satriani\",\"Age\":40,\"NumbersList\":[10,20,30]}";
var json2= "{\"Name\":\"Mike\",\"NumbersList\":[40,50,60]}";

另外,我有一个愚蠢的类来显示结果:

private void showResult(object theClass)
{
var result = JsonConvert.SerializeObject(theClass);
Debug.WriteLine("result: " + result);
}

现在,我用第一个 json 创建一个类:

var myPerson = JsonConvert.DeserializeObject<Person>(json1);

一切都很好:这个类得到了它应该得到的所有值:

showResult(myPerson);
result: {"Name":"Joe","Surname":"Satriani","Age":40,"NumbersList":[10,20,30]}

现在,我想将第二个 json 应用到已经存在的类实例:

JsonConvert.PopulateObject(json2, myPerson);

但是……这就是我得到的:

showResult(myPerson);   
result: {"Name":"Mike","Surname":"Satriani","Age":40,"NumbersList":[10,20,30,40,50,60]}

因此,据我所知,PopulateObject 正确地重写了标准字段属性(因为我没有将“JoeMike”作为名称,所以我只得到“Mike”,如果可以的话),但是,它附加列表/索引的,因为我没有获得“40,50,60”而是“10,20,30,40,50,60”...

所以,我的问题是:有没有办法避免 PopulateObject 故意附加 List/Index/Enumerable 对象?

【问题讨论】:

标签: c# json.net


【解决方案1】:

JsonSerializerSettings 类中,将ObjectCreationHandling 值设置为ObjectCreationHandling.Replace。使用此设置,信息不再附加而是复制。

JsonSerializerSettings jsonSerializerSettings = new JsonSerializerSettings()
{
   ObjectCreationHandling = ObjectCreationHandling.Replace
};
JsonConvert.PopulateObject(json2, myPerson, jsonSerializerSettings);

ObjectCreationHandling setting

【讨论】:

    猜你喜欢
    • 2017-05-19
    • 2016-05-17
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多