【问题标题】:JSON serialize and deserialize C# with Partial objectsJSON 使用 Partial 对象序列化和反序列化 C#
【发布时间】:2020-02-25 17:57:13
【问题描述】:

这是我要寻找的最终 JSON 对象 -

{
  "firstName": "John",
  "lastName": "Smith",
  "age": 27,
  "address": {
    "streetAddress": "21 2nd Street",      
    "city": "New York",
    "state": "NY",
    "postalCode": "10021-3100"         <-- Added by my application
  }
}

在这个例子中,我没有名字、姓氏和地址的一部分。我的逻辑部分只需要注入年龄和地址。有没有办法不复制我这边的整个对象?我可以有这样的对象吗 -

public class AdditionalAddressInfo
{
    public string postalCode { get; set; }
}

public class AdditionalUserInfo
{
    public int age { get; set; }
}

有没有办法将它序列化并添加到传入的 JSON 中。

【问题讨论】:

标签: c# json serialization json.net


【解决方案1】:

您可以使用DynamicObject进行部分反序列化,这样您就不需要了解其他属性:

var jsonString = @"{
                      ""firstName"": ""John"",
                      ""lastName"": ""Smith"",
                      ""address"": {
                        ""streetAddress"": ""21 2nd Street"",      
                        ""city"": ""New York"",
                        ""state"": ""NY"",     
                      }
                    }";

dynamic dynoObject = JsonConvert.DeserializeObject<dynamic>(jsonString);

//adding age
AdditionalUserInfo additionalUserInfo = new AdditionalUserInfo();
additionalUserInfo.age = 27;
dynoObject.age = additionalUserInfo.age;

//adding postalCode
AdditionalAddressInfo additionalAddressInfo = new AdditionalAddressInfo();
additionalAddressInfo.postalCode = "10021 - 3100";
dynoObject.address.postalCode = additionalAddressInfo.postalCode;

var newJson = JsonConvert.SerializeObject(dynoObject);

那么新的Json就会如预期的那样:

{
  "firstName": "John",
  "lastName": "Smith",
  "age": 27,
  "address": {
    "streetAddress": "21 2nd Street",      
    "city": "New York",
    "state": "NY",
    "postalCode": "10021-3100"       
  }
}

【讨论】:

    【解决方案2】:

    您可以通过修改 JObject 直接将新值添加到 Json。例如,

    var jObj = JObject.Parse(json);
    var address = jObj["address"] as JObject;
    address.Add("postalCode","10021-3100");
    jObj.Add("age",27);
    var result = jObj.ToString();
    

    输出

    {
      "firstName": "John",
      "lastName": "Smith",
      "address": {
        "streetAddress": "21 2nd Street",
        "city": "New York",
        "state": "NY",
        "postalCode": "10021-3100"
      },
      "age": 27
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-20
      • 1970-01-01
      • 1970-01-01
      • 2016-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多