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

4
我正在从一个我无法控制的外部API检索一些JSON,并需要将其反序列化为一个对象,其中一些字段嵌套在主对象的属性中,因此直接反序列化不起作用。
我找到的与我的问题最接近的问题是: 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个回答

3

由于默认的JSON.NetJsonConvert类无法将平面的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"]
                                               }  
                 };

我明白了,我考虑过这种方法,但是希望不必硬编码映射以保持可维护性,而且我不想使用反射,因为它的性能不是特别好。谢谢,我可能会选择这样做并处理维护开销。 - Vistari
即使使用反射,您仍可能遇到问题。假设在某个类的处理程序中,您有另一个类处理程序,并且该处理程序具有另一个名为“NiNo”的属性。如果您没有标识符(例如“prefix.NiNo”),则几乎不可能将正确的值设置为该属性。 - Tinwor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接