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

标签 c# json json.net

我正在从我无法控制的外部 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; }
}

我不确定如何实现自定义契约(Contract)解析器/JSON 转换器来获得所需的结果,因此不胜感激。

最佳答案

您不能使用默认的 JsonConvertJSON.Net因为它无法转换复杂类中的平面 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"]
                                               }  
                 };

关于c# - 使用 JSON.NET 将平面 JSON 对象反序列化为复杂对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40126886/

相关文章:

c# - 如何在 json 序列化中跳过属性名称?

c# - 如何解析 XSD 以从 <xsd :simpleType> elements using C#? 获取信息

c# - WPF 弹出 ZOrder

java - 获取不带方括号的字符串

c# - 以括号作为属性名称的新对象

c# - 反序列化运行时创建的类

c# - 面向对象的 Linq2Sql 查询类

c# - Kusto 客户端无法向服务 : Request headers must contain only ASCII characters 发送请求

json - 导出 JSON 数据并加载到关系数据库中

javascript - Vuejs 从数据属性返回 [object Object]