2015-08-19 10 views
-1

У меня есть это: JSONПолучить конкретное значение из структуры JSon

{ 
    "unashamedohio": 
     { 
      "id": 107537, 
      "name": "UnashamedOhio", 
      "profileIconId": 785, 
      "revisionDate": 1439997758000, 
      "summonerLevel": 30 
     } 
} 

Я хочу, чтобы получить поле с именем summonerLevel.

Я попытался преобразовать этот json в строку, а затем искать summonerLevel, но я знаю, что это решение не в порядке.

Я использую Json.NET.

+2

Существует множество вопросов о переполнении стека о разборе JSON. Вы можете проанализировать его до объекта, в котором вы создали соответствующий класс, или использовать «LINQ to JSON» от Json.NET или любое количество вещей. Пожалуйста, покажите, что вы пробовали. –

+0

Вы можете искать в строке. Другой альтернативой может быть десериализация на другой объект только с данными, которые вам нужны, но это тоже не отличная идея. Есть ли причина, по которой вы не можете десериализовать JSON в целый объект, а затем просто проверьте значение на объекте? – Mathieson

ответ

1

Я предполагаю, что это JSON хранится в виде строки, скажем, называется ... так JSON попробовать

string json = "..."; 
JObject obj = JsonConvert.DeserializeObject<JObject>(json); 
JObject innerObj = obj["unashamedohio"] as JObject; 
int lolSummorLvl = (int) innerObj["summonerLevel"]; 
+0

Невозможно неявно преобразовать тип 'System.Collections.Generic.Dictionary ' to 'Newtonsoft.Json.Linq.JObject'2013 \ Projects \ ConsoleApplication3 \ ConsoleApplication3 \ Program.cs. То, что ошибка im попадает в строку Jobject obj –

+0

звучит как ваш json хранится в словаре, а не в строке. – Aaron

2

Вы можете использовать ключевое слово dynamic

dynamic obj = JsonConvert.DeserializeObject(json); 
Console.WriteLine(obj.unashamedohio.summonerLevel); 
+0

Спасибо, эта работа вполне нормально. Может потребоваться больше узнать о динамических объектах. Спасибо всем btw –

+0

Мне очень нравится динамика, и есть ситуации, когда ее использование является единственным решением, но IMO следует использовать с осторожностью. – pasty

0

У вас есть несколько возможности (как уже было показано в других ответах). Другой возможностью было бы использовать JObject и JProperty свойства, обеспечиваемые из Json.NET для того, чтобы непосредственно получить значение, как это:

var jsonObject = (JObject)JsonConvert.DeserializeObject(json); 
var unashamedohio = (JObject)(jsonObject.Property("unashamedohio").Value); 
var summonerLevel = unashamedohio.Property("summonerLevel"); 
Console.WriteLine(summonerLevel.Value); 

Еще одна возможность будет создать типизированный модель структуры JSON:

public class AnonymousClass 
{ 
    public UnashamedOhio unashamedohio { get; set; }  
} 

public class UnashamedOhio 
{ 
    public int summonerLevel { get; set; } 
} 

и использовать его для получения значения:

var ao = JsonConvert.DeserializeObject<AnonymousClass>(json); 
Console.WriteLine(ao.unashamedohio.summonerLevel); 

Оба раствора печатать то же самое значение: 30.

IMO вы должны использовать всегда типизированные модели, если это возможно, и если вы делаете много полезной информации из структур JSON. Он обеспечивает проверку ошибок в среде IDE (в отличие от динамической), которая выплачивается во время выполнения.

Смежные вопросы