使用JSON.NET将平面JSON对象反序列化为复杂对象

时间:2016-10-19 09:07:23

标签: c# json json.net

我正在从外部API中检索一些我无法控制的JSON,并且需要将其反序列化为一个对象,其中某些字段嵌套到主对象的属性中,因此直接反序列化将不起作用。 / p>

我发现的最接近的问题是:

Json .Net serialize flat object into a complex object (change objects structure on serialization/deserialization)

我无法真正将此应用于我的问题,因为我对使用JSON.NET相当新,并且仍然试图了解它是如何工作的。

一个小样本,用于演示API中的json:

{
  FirstName: "John",
  LastName: "Smith",
  PassportNo: "xxxxx",
  NiNo: "xxxxx",
}

我想要反序列化的类:

internal sealed class Person
{
    [JsonProperty(PropertyName = "FirstName")]
    public string FirstName { get; set; }

    [JsonProperty(PropertyName = "LastName")]
    public string LastName { get; set; }

    public PrivateData PrivateData { get; set; }
}

internal sealed class PrivateData
{
    [JsonProperty(PropertyName = "PassportNo")]
    public string PassportNo { get; set; }

    [JsonProperty(PropertyName = "NiNo")]
    public string NationalInsuranceNumber { get; set; }
}

我不确定如何实施自定义合约解析器/ JSON转换器以获得所需的结果,因此任何指导都将受到赞赏。

1 个答案:

答案 0 :(得分:1)

您不能使用JsonConvert的默认JSON.Net类,因为它无法转换复杂类中的平面json结构。如果我在你身边,我会将json解析为Dictionary<string, string>,然后创建你的人员类 像这样:

Dictionary<string, string> values = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
var person = new Person { 
                 FirstName = values["FirstName"] , 
                 LastName =  values["LastName "], 
                 PrivateData = new PrivateData {
                                   PassportNo = values["PassportNo"],
                                   NationalInsuranceNumber = values["NiNo"]
                                               }  
                 };