2016-03-07 3 views
0

Как правило, десериализация не является проблемой для меня. Простой вызов JSON.NET и TADA! Но эта десериализация оказывается довольно сложной. Таким образом, основная схема выглядит следующим образом:Deserialize JSON TO LINQ-able Collection

{"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 
    } 
} 

Теперь без определения MASSIVE класса с 5000+ Кис я пошел маршрут:

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

Это дает мне следующую (LINQPad выход):

enter image description here

Как бы идти о LINQ-ки против ценностей, таких, как найти все JTokens с значением «Любые предложения». Я просто недостаточно гнездился? Потому что я пытался делать что-то вдоль линий:

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

Который оставляет меня:

enter image description here

Любая помощь будет fanstastic.

TL; DR; Хотите иметь возможность искать значения в коллекции с помощью LINQ и не можете определить синтаксис метода для этого.

+0

Я не вижу, что элементы в вашем словаре есть 5000 свойств. И даже если это так, вы можете просто десериализовать все как «Словарь ', который легко «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