2016-03-07 83 views
0

正常情况下,反序列化对我来说不是一个挑战。简单的调用JSON.NET和TADA!但是这种特殊的反序列化证明是相当困难的。所以基本架构如下:反序列化JSON到LINQ-able集合

{"1" : { 
    "name" : "Any Offers", 
    "stattrak" : "0", 
    "star" : "0", 
    "souvenir" : "0", 
    "sort" : "0", 
    "exterior" : "0", 
    "quality" : "0", 
    "icon" : "", 
    "worth" : 0, 
    "betable" : 0 
}, 
"2" : { 
    "name" : "Real Money", 
    "stattrak" : "0", 
    "star" : "0", 
    "souvenir" : "0", 
    "sort" : "0", 
    "exterior" : "0", 
    "quality" : "0", 
    "icon" : "", 
    "worth" : 0, 
    "betable" : 0 
    } 
} 

现在没有确定与5000+键一个巨大的类我去的路线:

var schema = JsonConvert.DeserializeObject<Dictionary<string,JToken>>(schemaString); 

这为我提供了以下(LINQPad输出):

enter image description here

我怎么会去-ING LINQ对值,如发现有“任何优惠”的值都JTokens。我只是不够嵌套?因为我试图做线沿线的东西:

schema.Select(x => x.Value.Children().Children().Values().Where(n=>n......)) 

这给我留下了:

enter image description here

任何帮助将是fanstastic。

TL; DR;希望能够使用LINQ对集合中的值进行搜索,并且无法找出这样做的方法语法。

+0

嵌套我没有看到,在你的字典的项目有5000个属性。即使它们是,你也可以反序列化为'Dictionary ',这很容易“LINQable”,尽管不是很安全。 –

回答

3

我会把它反序列化到一个具体的类,然后使用LINQ

public class Entry 
{ 
    public string name { get; set; } 
    public string stattrak { get; set; } 
    public string star { get; set; } 
    public string souvenir { get; set; } 
    public string sort { get; set; } 
    public string exterior { get; set; } 
    public string quality { get; set; } 
    public string icon { get; set; } 
    public int worth { get; set; } 
    public int betable { get; set; } 
} 

var schema = JsonConvert.DeserializeObject<Dictionary<string,Entry>>(schemaString); 

是这样的:schema.Values.Where(x=>x.name=="...")

+0

完美无瑕。我使用'Dictionary ',因为在类中使用'[JsonExtensionData]'时需要这样做,但在直接反序列化到该类型时不需要。谢谢 :) –

2

原来我是过于复杂的整个交易。该解决方案是以下几点:

schema.Select(x => x.Value["name"]); 

这是令人困惑的是由于LINQPad