JSON 解析需要很长时间



我正在使用Newtonsoft JSON来解析API的一些输出。但是,API 结果接近 2.5 MB,解析整个文件只是为了找到我需要的数据需要很长时间。下面是 API 输出的代码片段:

{
"response": {
    "success": 1,
    "current_time": 1416085203,
    "raw_usd_value": 0.2,
    "usd_currency": "metal",
    "usd_currency_index": 5002,
    "items": {
        "A Brush with Death": {
            "defindex": [
                30186
            ],
            "prices": {
                "6": {
                    "Tradable": {
                        "Craftable": [
                            {
                                "currency": "metal",
                                "value": 3,
                                "last_update": 1414184620,
                                "difference": -0.165
                            }
                        ]
                    }
                }
            }
        },

我的代码应该在 defindex 数组中找到唯一一个对象,该对象是数字为"5021"的项目对象的子对象,并提取货币和值数据。以下是我用来查找数据的代码:

dynamic result = Newtonsoft.Json.JsonConvert.DeserializeObject(priceFile);
int keyprice = 0;
foreach(var items in result.response.items){
            foreach(var item in items){
                string indexstr = item.defindex.ToString();
                if (indexstr.Contains(defindex))
                {
                    foreach(var price in item.prices){
                        foreach (var quality in price)
                        {
                            Console.WriteLine("{0} {1}", quality.Tradable.Craftable[0].value, quality.Tradable.Craftable[0].currency);
                            keyprice = quality.Tradable.Craftable[0].value;
                            return keyprice;
                        }
                    }
                }
            }
        }

理想情况下,代码最多只需 10 秒即可运行。

我会为响应对象创建一个类,然后使用类似于以下内容的代码。我在 2.8MB 的 json 文件上进行了测试,平均大约 1.2 秒,也尝试使用 fastJSON(有一个 nuget 包) - 它是我找到的最快的解析器。

        string fileName = @"c:tempjsonyourfile.json";
        string json;
        using (StreamReader sr = new StreamReader(fileName))
        {
            json = sr.ReadToEnd();
        }
        response myResponse = fastJSON.JSON.ToObject<response>(json);
        var item = myResponse.First(i => i.defindex == "5051");
        foreach (var price in item.prices)
        {
            foreach (var quality in price)
            {
                Console.WriteLine("{0} {1}", quality.Tradable.Craftable[0].value, quality.Tradable.Craftable[0].currency);
                keyprice = quality.Tradable.Craftable[0].value;
                return keyprice;
            }
        }

相关内容

  • 没有找到相关文章

最新更新