【问题标题】:Deserialize multiple pages of JSON into a single object?将多页 JSON 反序列化为单个对象?
【发布时间】:2020-06-23 19:04:30
【问题描述】:

我正在调用一个 API,它以每页 5 个结果返回 JSON 格式的结果。我正在打 5 个电话以获得所有结果。我创建了一个自定义类型,可以毫无问题地反序列化第一个 JSON 页面。然后,我需要将其他页面添加到同一个对象,以便以后可以循环该对象以用作键/值查找。我通常编写 PHP 代码并简单地使用 array_push 来组合数组,然后循环遍历数组以找到我正在寻找的 id / display_number。

JSON

所有 JSON 格式如下。

{
    "meta": {
        "paging": {
            "next": "https://URL/api/v4/companies.json?limit=5&page_token=t324vbf8673"
        },
        "records": 25
    },
    "data": [
        {
            "id": 1096720,
            "display_number": "Company:00001"
        },
        {
            "id": 1096723,
            "display_number": "Company:00002"
        },
        {
            "id": 1096726,
            "display_number": "Company:00003"
        },
        {
            "id": 1096729,
            "display_number": "Company:00004"
        },
        {
            "id": 1096732,
            "display_number": "Company:00005"
        },
}

守则

我正在使用它来反序列化为名为 Companies 的自定义类型对象

Companies Company = JsonConvert.DeserializeObject<Companies>(response.Content);

这部分很好,但显然在循环中,它会覆盖前一个对象,而不是合并成一个对象。

问题

如何将最后一页与上一页合并(共 5 页)?

编辑

API 调用:

public Companies GetCompanies(int records, string pageurl="")
    {
        var client = new RestClient();

        if(pageurl != "")
        {
            client = new RestClient(pageurl);
        }
        else
        {
            client = new RestClient(this.BaseURI + "companies.json");
        }
        var request = new RestRequest(Method.GET);
        request.AddHeader("cache-control", "no-cache");
        request.AddHeader("content-type", "application/x-www-form-urlencoded");
        request.AddHeader("Authorization", this.TokenType + " " + this.AccessToken);
        request.AddParameter("limit", records);

        IRestResponse response = client.Execute(request);

        var content = response.Content;

        Companies Company = JsonConvert.DeserializeObject<Companies>(response.Content);
        return Company;
    }

班级:

namespace Uploader
{
    using System;
    using System.Collections.Generic;

    using System.Globalization;
    using Newtonsoft.Json;
    using Newtonsoft.Json.Converters;

    public partial class Companies
    {
        [JsonProperty("meta")]
        public Meta Meta { get; set; }

        [JsonProperty("data")]
        public Datum[] Data { get; set; }
    }

    public partial class Datum
    {
        [JsonProperty("id")]
        public long Id { get; set; }

        [JsonProperty("display_number")]
        public string DisplayNumber { get; set; }
    }

    public partial class Meta
    {
        [JsonProperty("paging")]
        public Paging Paging { get; set; }

        [JsonProperty("records")]
        public long Records { get; set; }
    }

    public partial class Paging
    {
        [JsonProperty("next")]
        public Uri Next { get; set; }
    }
}

我是如何使用课程的:

Companies GetCompanies = Clio.GetCompanies(5);
do
{
    GetCompanies = Clio.GetCompanies(5, GetCompanies.Meta.Paging.Next.ToString());
} while (GetCompanies.Meta.Paging.Next != null);

【问题讨论】:

  • 可以添加Matters的代码吗?以及“我打了 5 次电话以获得所有结果”的代码?目前还不清楚您是否未能反序列化、寻找连接多个list&lt;Matters&gt; 的方法,或者只是对我们看不到的逻辑有问题。
  • CompaniesMatters 类型之间有什么关系?你如何打电话来获取一个json?
  • 事务应该是公司。现已更正。
  • @xdtTransform 我已经把代码放在上面了。我不会反序列化。我可以很好地反序列化,但我不知道如何将 5 页结果组合成一个对象。这就是我正在努力解决的部分。

标签: c# .net


【解决方案1】:

我认为解决方案是将这些公司添加到List

var listOfCompanies = new List<Companies>();

Companies companies  = Clio.GetCompanies(5);
listOfCompanies.Add(compaines); 
do
{
    companies = Clio.GetCompanies(5, companies.Meta.Paging.Next.ToString());
    listOfCompanies.Add(compaines); 
} while (GetCompanies.Meta.Paging.Next != null);

foreach(var companyBatch in compaines)
{
     // process data here...
}

或者,如果您不想将元​​数据保留在列表中:

var listOfCompanyData = new List<Datum>();

Companies companies  = Clio.GetCompanies(5);
listOfCompanyData.AddRange(compaines.data); 
do
{
    companies = Clio.GetCompanies(5, companies.Meta.Paging.Next.ToString());
    listOfCompanyData.AddRange(compaines.data); 
} while (GetCompanies.Meta.Paging.Next != null);

foreach(var companyDatum in listOfCompanyData)
{
     // process data here...
}

【讨论】:

  • 谢谢。我会看一下。最终,我只需要列表中的 id 和 display_number,这样我以后就可以使用已知的 display_number 进行简单的查找以获取 id。元不重要,只用于循环浏览多个 JSON 页面。
  • new List&lt;Datum&gt;(); 应该是new List&lt;Datum[]&gt;();
  • 你知道我如何在 foreach 循环中返回 id 和 display_name 吗?我正在使用Debug.WriteLine(companyDatum));,它返回“Uploader.Datum[]”。没有任何 id 或 display_name 属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-20
  • 1970-01-01
  • 2023-03-12
  • 2020-12-02
  • 2021-12-16
相关资源
最近更新 更多