2016-03-22 2 views
2

Я звоню в RESTful службы в C# и результат похож на это:Получить список частичного объекта из JSON C#

{ 
    "blabla":1, 
    "bbb":false, 
    "blabla2":{ 
    "aaa":25, 
    "bbb":25, 
    "ccc":0 
    }, 
    "I_want_child_list_from_this":{ 
    "total":15226, 
    "max_score":1.0, 
    "I_want_this":[ 
     { 
     "A":"val1", 
     "B":"val2", 
     "C":"val3" 
     }, 
     { 
     "A":"val1", 
     "B":"val2", 
     "C":"val3" 
     } 
     ... 
     ] 
    "more_blabla": "fff" 
    ... 
} 

Я хочу, чтобы получить «I_want_this» часть как list из object или JObject есть ли что-то вроде

(JObject)responseString["I_want_child_list_from_this"]["I_want_this"] 

более обобщенно:

(JObject)responseString["sub"]["sub_sub"] 

Я пользуюсь Newtonsoft.Json

Спасибо!

+0

Какой JSON-парсер вы используете? Newtonsoft? –

+0

Да, используя 'Newtonsoft.Json' – DDan

+0

смотрите, например. здесь http://www.newtonsoft.com/json/help/html/SerializingJSONFragments.htm – Gomes

ответ

1

Подходящая ссылка оказывается близка к решению в качестве реквестера, использующего NewtonSoft.Json как его api для управления объектом. Оцените решения от других пользователей.

смотрите, например. здесь newtonsoft.com/json/help/html/SerializingJSONFragments.htm

+0

Вы можете суммировать информацию здесь? Ответы только на связь склонны к поломке, а иногда и к пометке и удалению. –

2

Прежде всего, я бы создал класс, представляющий структуру JSON, возвращенную из служебного вызова. (http://json2csharp.com/ отличная утилита для автогенерирующих классов от JSON)

Во-вторых, если вы не используете библиотеку Newtonsoft.Json, я бы рекомендовал захватить эту библиотеку.

Наконец, используйте Newtonsoft десериализации JSON из вызова службы в классе вы создали:

var json = Service.GetJson(); 
var yourDesiralizedJson = JsonConvert.DeserializeObject<YourJsonToCSharpClass>(json); 
var listYouWant = yourDesiralizedJson.IWantChildList.IWantThis; 
+0

Спасибо, это выглядит идеально, однако у меня нет общей структуры для типа результата, поэтому я ожидаю 'object' или 'JObject's – DDan

1

Лучшее решение (IMO) является определение классов, которые описывают вашу JSON схему затем использовать DeserializeObject, как это было предложено от ertdiddy. В качестве ярлыка вы можете использовать DeserializeAnonymousType с неполными определениями вашей схемы, пользуясь снисходительностью JSON. В вашем случае этот код работает для меня:

 var testDataFromQuestion = @" 
{ 
    ""blabla"":1, 
    ""bbb"":false, 
    ""blabla2"":{ 
    ""aaa"":25, 
    ""bbb"":25, 
    ""ccc"":0 
    }, 
    ""I_want_child_list_from_this"":{ 
    ""total"":15226, 
    ""max_score"":1.0, 
    ""I_want_this"":[ 
     { 
     ""A"":""val1"", 
     ""B"":""val2"", 
     ""C"":""val3"" 
     }, 
     { 
     ""A"":""val1"", 
     ""B"":""val2"", 
     ""C"":""val3"" 
     } 
     ], 
    ""more_blabla"": ""fff"" 
}"; 

     var anonymousDefinitionOfJson = new { 
      I_want_child_list_from_this = new { 
       I_want_this = new Dictionary<string, string>[] {} 
      } 
     }; 
     var fullDeserializationOfTestData = 
      JsonConvert.DeserializeAnonymousType(testDataFromQuestion, 
               anonymousDefinitionOfJson); 
     var stuffYouWant = insterestingBits.I_want_child_list_from_this.I_want_this; 
     Console.WriteLine($"The first thing I want is {stuffYouWant[0]["A"]}"); 

Это выводит ожидаемое значение «val1». Я анонимно определяю минимальные классы, которые получают только нужные вам данные, затем я прошу Newtonsoft разобрать достаточно, чтобы заполнить эти классы.

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