【问题标题】:Serialize only dirty properties on object仅序列化对象上的脏属性
【发布时间】:2017-08-17 06:23:40
【问题描述】:

我正在用 C# 实现一个 API 客户端。我正在开发的 API 是 Close.IO。

它们允许更新对象上的单个字段,例如)更新lead.description

https://developer.close.io/#leads-update-an-existing-lead

请求正文

{
    "description": "Best show ever canceled.  Sad."
}

我的问题是,如何在 c# 中创建一个新的 Lead 对象,更新“description”属性,然后仅将更新后的 description 属性作为请求正文的一部分发送?

public class Lead{
    public int id {get;set;}
    public string description {get;set;}
    public string notes {get;set;}
}

var lead = new Lead(){
    id = 1,
    description = "Best show ever canceled.  Sad."
}
var body = JsonConvert.SerializeObject(lead);
client.Update<Lead>(body);

在上面的示例中,id 为 1 的潜在客户将被更新,描述将被设置,“notes”属性将被清除。

请求正文

{
    "id":1,
    "description": "Best show ever canceled.  Sad.",
    "notes" : ""
}

我只希望“描述”字段得到更新,而注释字段保持不变。我正在寻找一种干净的方式来使用我的类型化对象并将其序列化到请求正文中,并且只更新脏属性。

【问题讨论】:

  • 我想最大的问题是,你是如何序列化那个对象的? null 属性应该被序列化为空字符串似乎很奇怪。再说一次,我自己在使用 xml 时也遇到了类似的问题,但使用反序列化 - wcf 将 null、空和不存在全部反序列化为 null。
  • 我正在使用 Json.Net 进行序列化,我在示例中添加了附加代码以显示这一点
  • 奇怪,5 年前someone had the exact opposite problem。会发生什么变化,还是我们在 Lead 上缺少一个将 notes 设置为默认值的 ctor?

标签: c# api


【解决方案1】:

这是内置在 Json.Net 中的,具有以下设置..

var data = new { x = 1};
var settings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore };
var text = JsonConvert.SerializeObject(data, Formatting.Indented, settings);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多