如何通过 API 从大数组中获取所有对象 (C#)

How to get all Objects from a big Array by an API (C#)

Newtonsoft.Json.JsonReaderException: "看完JSON内容后遇到的追加文字

你好, 我尝试从 API (steam-API) 提供的大数组中获取每个对象。 我需要多次调用才能获取所有对象,因为它们是 "total_count":15228。 这是我获得 first page 的方法,效果非常好:

public static Task LoadAllItemsAsync()
        {
            int start=0;
            string responseData = "";
            
                
                using (WebClient w = new WebClient())
                {
                    responseData = responseData + w.DownloadString("https://steamcommunity.com/market/search/render/?search_descriptions=0&sort_column=default&sort_dir=desc&appid=730&norender=1&count=100&start=" + start);
                    
                    Thread.Sleep(3000);
                    w.Dispose();
                }
                start = start + 100;
            

            

            dynamic parsedJson = JsonConvert.DeserializeObject(responseData);
            string jsonData = JsonConvert.SerializeObject(parsedJson, Formatting.Indented);
            System.IO.File.WriteAllText(System.IO.Path.GetFullPath(@"..\..\SteamData\SteamItems.json"), jsonData);

            return Task.CompletedTask;

        }

为了获得所有对象,我尝试通过将 start 值增加 100 来遍历所有页面,这里是我得到的地方当我尝试反序列化 responsData 字符串时出现异常。 代码:

public static Task LoadAllItemsAsync()
        {
            int start=0;
            string responseData = "";
            for(int i = 0; i <= 1; i++)
            {
                
                using (WebClient w = new WebClient())
                {
                    responseData = responseData + w.DownloadString("https://steamcommunity.com/market/search/render/?search_descriptions=0&sort_column=default&sort_dir=desc&appid=730&norender=1&count=100&start=" + start);
                    
                    Thread.Sleep(3000);
                    w.Dispose();
                }
                start = start + 100;
            }

            

              dynamic parsedJson = JsonConvert.DeserializeObject(responseData); //Newtonsoft.Json.JsonReaderException: "Additional text encountered after finished reading JSON content
            string jsonData = JsonConvert.SerializeObject(parsedJson, Formatting.Indented);
            System.IO.File.WriteAllText(System.IO.Path.GetFullPath(@"..\..\SteamData\SteamItems.json"), jsonData);

            return Task.CompletedTask;

        }

我在 google 上找到了一些东西,但我不明白,也不知道如何将它应用到我的代码中。 我非常感谢任何答案。

编辑:
我尝试过的:

public static Task LoadAllItemsAsync()
        {
            int start=0;
            string responseData = "";
            string jsonData = "";
            for (int i = 0; i <= 1; i++)
            {               
                using (WebClient w = new WebClient())
                {
                    responseData = responseData + w.DownloadString("https://steamcommunity.com/market/search/render/?search_descriptions=0&sort_column=default&sort_dir=desc&appid=730&norender=1&count=100&start=" + start);
                    dynamic parsedJson = JsonConvert.DeserializeObject(responseData);
                    jsonData = jsonData + JsonConvert.SerializeObject(parsedJson, Formatting.Indented);
                    
                }
                start = start + 100;
            }
            System.IO.File.WriteAllText(System.IO.Path.GetFullPath(@"..\..\SteamData\SteamItems.json"), jsonData);
            return Task.CompletedTask;
        }

请检查以下代码。第一步是从您的 json 中提取 c# 类型 - 我为此使用了 https://json2csharp.com/。然后你应该遍历请求并将每个请求反序列化到你的对象中。在单独的列表中收集您需要的所有对象,序列化并写入文件。

using Newtonsoft.Json;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Threading;

namespace SteamMarketJson
{
    public class Searchdata
    {
        public string query { get; set; }
        public bool search_descriptions { get; set; }
        public int total_count { get; set; }
        public int pagesize { get; set; }
        public string prefix { get; set; }
        public string class_prefix { get; set; }
    }

    public class AssetDescription
    {
        public int appid { get; set; }
        public string classid { get; set; }
        public string instanceid { get; set; }
        public string background_color { get; set; }
        public string icon_url { get; set; }
        public int tradable { get; set; }
        public string name { get; set; }
        public string name_color { get; set; }
        public string type { get; set; }
        public string market_name { get; set; }
        public string market_hash_name { get; set; }
        public int commodity { get; set; }
    }

    public class Result
    {
        public string name { get; set; }
        public string hash_name { get; set; }
        public int sell_listings { get; set; }
        public int sell_price { get; set; }
        public string sell_price_text { get; set; }
        public string app_icon { get; set; }
        public string app_name { get; set; }
        public AssetDescription asset_description { get; set; }
        public string sale_price_text { get; set; }
    }

    public class RootObject
    {
        public bool success { get; set; }
        public int start { get; set; }
        public int pagesize { get; set; }
        public int total_count { get; set; }
        public Searchdata searchdata { get; set; }
        public List<Result> results { get; set; }
    }

    class Program
    {
        static HttpClient httpClient = new HttpClient();

        private const string BASE_URL = "https://steamcommunity.com/market/search/render/?search_descriptions=0&sort_column=default&sort_dir=desc&appid=730&norender=1&count=100&start=";

        static void Main(string[] args)
        {
            int start = 0;

            List<Result> results = new List<Result>(); // you probably want to store results only
            
            RootObject rootObject = null;
            do
            {
                var response = httpClient.GetAsync(BASE_URL + start).Result; // use await instead of .Result when used in methods
                var body = response.Content.ReadAsStringAsync().Result;
                rootObject = JsonConvert.DeserializeObject<RootObject>(body);

                if (rootObject.results != null)
                {
                    results.AddRange(rootObject.results);
                }
                start += 100;

                Thread.Sleep(3000);
            }
            while (start < rootObject.total_count);


            // write to file

            var jsonResult = JsonConvert.SerializeObject(results);

            File.WriteAllText("D:\file.txt", jsonResult);


            // read and deserialize it back

            var fileContent = File.ReadAllText("D:\file.txt");

            var items = JsonConvert.DeserializeObject<List<Result>>(fileContent);


        }
    }
}