繁体   English   中英

JSON 使用 Partial 对象序列化和反序列化 C#

[英]JSON serialize and deserialize C# with Partial objects

这是我要寻找的最终 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。

您可以使用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"       
  }
}

您可以通过修改 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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM