JSON解析需要太长时间

时间:2014-11-15 22:18:59

标签: c# json json.net

我正在使用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
                            }
                        ]
                    }
                }
            }
        },

我的代码应该找到唯一的对象是item对象的子对象,其编号为' 5021'在defindex数组中,拉出货币和值数据。这是我用来查找数据的代码:

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秒钟即可运行。

1 个答案:

答案 0 :(得分:2)

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

        string fileName = @"c:\temp\json\yourfile.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;
            }
        }