【问题标题】:Deserialising a flat JSON object into a complex object using JSON.NET使用 JSON.NET 将平面 JSON 对象反序列化为复杂对象
【发布时间】:2016-10-19 09:07:23
【问题描述】:

我正在从我无法控制的外部 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 转换器以获得所需的结果,因此我们将不胜感激。

【问题讨论】:

    标签: c# json json.net


    【解决方案1】:

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

    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"]
                                                   }  
                     };
    

    【讨论】:

    • 我明白了,我考虑过这种方法,但希望不必为了可维护性而对映射进行硬编码,并且我不想使用反射,因为它不是特别高效。谢谢,我可能会这样做并处理维护开销。
    • 即使反射也可能有问题。假设在 person 类中您有另一个类处理程序,而在该处理程序中您有另一个名为 NiNo 的属性。如果您没有标识符(例如 prefix.NiNo),则几乎不可能为属性设置正确的值
    猜你喜欢
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多