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

时间:2015-02-19 16:02:26

标签: c# .net json json.net

我有这样一个班级:

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

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

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

这个想法是使用:

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

但这样做Pw被null覆盖(显然我想保留原始值)

NullValueHandling看起来是一个很好的候选者但是如果值为null则它可以工作,在我的情况下,json完全没有。 知道如果json中缺少值,如何反序列化json,保留目标对象中的旧值?

2 个答案:

答案 0 :(得分:2)

使用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

答案 1 :(得分:0)

此部分代码JsonConvert.DeserializeObject<item>(jsoncomingfromclient);将根据参数item创建jsoncomingfromclient类型的新实例并将其返回。

此部分item myitem = ...声明类型为myitem的变量item并为其提供具体实例。所以没有办法合并这样的东西。

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


像这样的东西

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