Deserialise嵌套JSON与Newtonsoft和C#(Deserialise nested

2019-09-19 15:18发布

我试图解析形式的REST API的JSON响应。 我能得到的响应很好,创造了一些中高级车型。 我使用Newtonsoft的Json.Net。

我一直在我的回应得到空值,我不知道我是否有设置我的模型正确,或思念的东西?

我试图得到的是例如,名字和ReferenceNumber这是在数据\项目\员工

我的JSON响应的一个例子是:

{
"Data": {
    "Links": [
  {
    "Rel": "parent",
    "Href": "http://Api/url/",
    "Title": "Api",
  }
],
    "Items": [
  {
    "Employee": {
  "ReferenceNumber": "0078952",
  "EmployeeStatus": {
    "Name": "Active",
    "Value": 2
  },
  "ContactByPost": true,
  "ContactByMarketingEmails": true,
  "ClientDetails": [
    {
      "LimitedCompany": {
        "Id": "809f4455-673d-df11-9849-00155d072900",
        "Name": "Company"
      },
      "ClientCompany": {
        "Id": "62494f0c-617d-412f-81a3-ca40ef80f774",
        "Name": "Company 2"
      },
      "Code": "G67D",
      "RefCode": "1271",
      "Date": "\/Date(1333456265000+0100)\/",
      "Id": "009ea227-887d-e111-96ec-000c29128cee",
      "CreatedOn": "\/Date(1333455954000+0100)\/",
      "CreatedBy": {
        "Id": "5c2cb5eb-7368-e111-96eb-000c29128cee",
        "Name": "System Administrator"
      },
      "Archived": false
    }
  ],
  "Title": {
    "Name": "Mr",
    "Value": 1
  },
  "FirstName": "Fred",
  "MiddleName": null,
  "LastName": "Flintstone",
  "KnownAs": null,
  "DateOfBirth": "\/Date(315576000000+0000)\/",
  "Gender": {
    "Name": "Male",
    "Value": 1
  },
  "HomePhoneNumber": "55555555555",
  "MobilePhoneNumber": null,
  "Addresses": null,
  "EmailAddresses": null,
  "Id": "009ea227-887d-e111-96ec-000c29128cee",
  "CreatedOn": "\/Date(1333455954000+0100)\/",
  "CreatedBy": {
    "Id": "5c2cb5eb-7368-e111-96eb-000c29128cee",
    "Name": "System Administrator"
  },
  "Archived": false
},
    "Links": [
      {
        "Rel": "list",
        "Href": "http://Api/Addresses",
        "Title": "Addresses",
        "Description": "Get a list of addresses for this Employee."
      }
    ]
  }
]
}
}

我的模型是设置如下图所示:

public class Data
{
    public Collection<Links> Links { get; set; }
    public Collection<Items> Items { get; set; }
}
public class Items
{
    public Employee Employee { get; set; }
}
public class Employee
{
    public string ReferenceNumber { get; set; }
    public string FirstName { get; set; }
    public string MiddleName { get; set; }
    public string LastName { get; set; }
    public string Id { get; set; }
}
public class Links
{
    public string Rel { get; set; }
    public string Href { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
}

在我的控制器我做了以下内容:

Data data = Newtonsoft.Json.JsonConvert.DeserializeObject<Data>(APIResponse);

我看到在调试的时候是一个项目,并且都是空链接。 我真的不知道我在做什么错误或如何得到这个工作,所以我可以在我的C#代码访问值? 任何帮助,将不胜感激。 该应用程序是MVC3。 这些例子我已经看到了使用简单的JSON结构。

Answer 1:

JSON字符串不从解串器的观点来看,适合数据类。 它把根对象与名为“数据”一个单一的财产,而它希望看到一个物体“项目”和“链接”属性。 所以它只是构建了一个数据实例,并保留其属性为null。

为了解决这个问题,去掉包装的对象,所以你留下了以下内容:{“项目”:[..],“链接”:[...]}

然后再试一次反序列化。



Answer 2:

我设法解决这个问题。 我所做的就是先创建父类来处理数据对象,@Jake还提到。 我创建了一个类类型ClientDetails我曾在Employee类如下:

public ClientDetails clientDetails {get; set;}

这造成了一个错误作为ClientDetails是一个数组。 我把它改为如下:

public List<ClientDetails> clientDetails {get; set;}

这解决了这个问题,现在我的整个数据对象中填充了来自API的响应。

@Jake,感谢您的输入...



文章来源: Deserialise nested JSON with Newtonsoft and C#