2017-01-19 3 views
1

Я в настоящее время десериализации строки JSON, используя NuGet пакет Newtonsoft.Json используя следующий код:C# получить значение из объекта Десериализованного JSon

var data = (JObject)JsonConvert.DeserializeObject(json); 

Теперь я получаю объект в следующем формате:

{{ "meta": { "rap": 2098, "count": 5 }, "data": [ {  "name": "Gold Tetramino of Mastery",  "rap": 735,  "uaid": "16601901",  "link": "https://www.roblox.com/Gold-Tetramino-of-Mastery-item?id=5786047",  "img": "https://t4.rbxcdn.com/081337d7ea86e6a406512aaa83bbcdeb",  "serial": "---",  "count": 1 }, {  "name": "Silver Tetramino of Accomplishment",  "rap": 385,  "uaid": "16601900",  "link": "https://www.roblox.com/Silver-Tetramino-of-Accomplishment-item?id=5786026",  "img": "https://t1.rbxcdn.com/60da69cd76f8dad979326f63f4a5b657",  "serial": "---",  "count": 1 }, {  "name": "Subzero Ski Specs",  "rap": 370,  "uaid": "155175547",  "link": "https://www.roblox.com/Subzero-Ski-Specs-item?id=19644587",  "img": "https://t4.rbxcdn.com/8ead2b0418ef418c7650d34103d39b6d",  "serial": "---",  "count": 1 }, {  "name": "Rusty Tetramino of Competence",  "rap": 319,  "uaid": "16601899",  "link": "https://www.roblox.com/Rusty-Tetramino-of-Competence-item?id=5785985",  "img": "https://t2.rbxcdn.com/968ad11ee2f4ee0861ae511c419148c8",  "serial": "---",  "count": 1 }, {  "name": "Bluesteel Egg of Genius",  "rap": 289,  "uaid": "16601902",  "link": "https://www.roblox.com/Bluesteel-Egg-of-Genius-item?id=1533893",  "img": "https://t7.rbxcdn.com/48bf59fe531dd1ff155e455367e52e73",  "serial": "---",  "count": 1 } ]}} 

Теперь я пытаюсь получить следующее значение из него:

"rap": 2098, 

мне просто нужно 2098 и я пытался следующий код:

string rap = data["rap"].Value<string>(); 

Но, к сожалению, это не будет работать. Кто-нибудь есть идея, как получить ценность?

+0

Разобрать его вместо десериализации, если вам нужно только одно значение – Plutonix

ответ

1

Try:

var result = data["meta"]["rap"].Value<int>(); 

или

var result = data.SelectToken("meta.rap").ToString(); 

или если вы не хотите, чтобы хотеть, чтобы пройти весь путь, вы можете просто поиск имущества, как это:

var result = data.Descendants() 
       .OfType<JProperty>() 
       .FirstOrDefault(x => x.Name == "rap") 
       ?.Value; 
2

Вместо того, чтобы объявлять как тип var и позволять компилятору сортировать его, объявлять как динамический и использовать метод Parse.

dynamic data = JArray.Parse(json); 

Тогда попробуйте

data.meta.rap 

Чтобы получить внутренний объект рэп. Я отредактировал с использованием метода deserializeобъекта, поскольку я неправильно подумал, что имеет тип динамического возврата. Смотрите здесь на Json.NET документации для получения более подробной информации: http://www.newtonsoft.com/json/help/html/QueryJsonDynamic.htm

+0

Там нет 'метода Parse' на' JsonConvert'. – William

+0

@billisphere спасибо, должен был проверить тройку ..! –

1
var jobject = (JObject)JsonConvert.DeserializeObject(json); 
var jvalue = (JValue)jobject["meta"]["rap"]; 
Console.WriteLine(jvalue.Value); // 2098 
0

Значение фактически int типа. Попробуйте:

int rap = data["rap"].Value<int>(); 
0
string rap = JsonConvert.DeserializeObject<dynamic>(json).meta.rap; 
Console.WriteLine(rap); // 2098 

Если вы не в dynamic (или не используют .NET 4+), мне нравится, как this other answer полагается исключительно на API Json.NET в.

0

Просто используйте динамическое представление объекта:

dynamic obj = JsonConvert.DeserializeObject(json) 
var value = obj.meta.rap; 

JObject легко конвертируемый самый динамический тип. Вы можете либо получить строку или Int из этого значения:

var ivalue = (int)obj.meta.rap; 
var svalue = (string)obj.meta.rap; 
Смежные вопросы