如果反序列化时 json 中不存在,则保留旧值

Keep old values if not present in the json when deserialize

我有这样一个class:

public class item
{
    public string Name { get; set; }
    public string City { get; set; }
    public string Pw { get; set; }
}

我从中创建了几个存储在数据库中的对象。然后我想用来自客户端的数据以 json 的形式更新其中之一,如下所示:

{  
   "Name":"John",
   "City":"NYC"
}

想法是使用:

item myitem = JsonConvert.DeserializeObject<item>(jsoncomingfromclient);

但是这样做Pw被null覆盖了(虽然显然我想保留原来的值)

NullValueHandling 看起来是个不错的候选者,但如果值为 null 则它有效,在我的例子中它完全不在 json 中。 知道如何反序列化 json 如果 json 中缺少值,则将旧值保留在目标对象中吗?

这部分代码 JsonConvert.DeserializeObject<item>(jsoncomingfromclient); 将根据参数 jsoncomingfromclient 和 return 创建类型 item 的新实例。

这部分item myitem = ...声明了一个类型item的变量myitem并给它一个具体的实例。所以没有办法合并这样的东西。

您只需手动编写一些合并方法并定义两个对象之间合并的内容和方式。


类似的东西

item dbitem = ...
item myitem = JsonConvert.DeserializeObject<item>(jsoncomingfromclient);
item mergedItem = myitem.merge(dbitem)

使用JsonConvert.PopulateObject。它专为此目的而设计:

        var item = new item { Name = "my name", City = "my city", Pw = "my pw" };

        var json = @"
        {  
           ""Name"":""John"",
           ""City"":""NYC""
        }";

        JsonConvert.PopulateObject(json, item);

        Debug.Assert(item.Pw == "my pw"); // no assert
        Debug.Assert(item.Name == "John"); // no assert
        Debug.Assert(item.City == "NYC"); // no assert