【问题标题】:Keep old values if not present in the json when deserialize如果反序列化时 json 中不存在旧值,则保留旧值
【发布时间】:2015-02-19 16:02:26
【问题描述】:

我有这样的课:

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,将旧值保留在目标对象中?

【问题讨论】:

  • 您的示例根本不包含“原始值”...听起来您应该只是在两个 item 值之间编写合并例程。 (理想情况下,同时修复名称以使其更惯用......)

标签: c# .net json json.net


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这部分代码JsonConvert.DeserializeObject&lt;item&gt;(jsoncomingfromclient); 将根据参数jsoncomingfromclient 创建item 类型的新实例并返回它。

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

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


    类似的东西

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

    【讨论】:

    • 显然这只是一个例子,在真实情况下,class/json 有几十个(一百个?)项目。我不能在反序列化后合并,因为 myitem 将具有空值(如果新值为空,我可以保留旧值,但这样做我将无法使用空值和旧值进行更新,这可能是必要的)。所以我需要在反序列化“期间”合并。任何想法都非常受欢迎。
    猜你喜欢
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    相关资源
    最近更新 更多