2014-01-30 3 views
0

Мы пытаемся написать способ использования JSON-канала у третьей стороны, но, к сожалению, он не очень хорошо написан, не существует правил о том, что иногда бывает или нет, а также изменяется структура в зависимости от на ключе, у меня нет способа изменить это, мы должны работать с тем, что имеем. Мы знаем, что мы хотим, основываясь на определенных ключах, но мы изо всех сил пытаемся найти их в качестве изменений вложенной структуры.Запрос JSON с неизвестной структурой

Можно ли сгладить JSON до одного списка> что мы можем запросить и ключ будет полное имя, включая родителей, поэтому следующий JSON:

{ 
    "employees": [ 
    { "firstName":"John" , "lastName":"Doe" }, 
    { "firstName":"Anna" , "lastName":"Smith" }, 
    { "firstName":"Peter" , "lastName":"Jones" } 
    ] 
} 

бы стать список с ключами как:

"employees.firstName" and a value of "John". 

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

+0

можно разобрать любую JSON в 'dictionary' так что вы можете' сотрудников [ "FirstName "]' is '' John "' – Grundy

+0

Это было очень упрощенное решение, к сожалению, JSON, который мы получаем, очень вложен, иногда на 10 слоев, и, как я уже сказал, мы не всегда знаем, как он будет выглядеть, но имена свойств set, поэтому, если бы мы могли получить строку с ключом типа level1.level2.level3.level4.level5.firstName, тогда мы могли бы запросить «firstName». – user351711

+0

вы можете увидеть о [JObject] (http://james.newtonking.com/json/help/index.html?topic=html/T_Newtonsoft_Json_Linq_JObject.htm) и JSON.Net – Grundy

ответ

0

Если вы не знаете достоверную структуру JSON, но вы уверены в имени свойства ex "firstName". Вы можете использовать JObject JSON.NET и рекурсивно прокручивать его и проверить, существует ли свойство, которое вы ищете, в текущем JToken.

Код должен выглядеть примерно так, обратите внимание на код, который я не компилировать это может иметь некоторые опечатки:

private List<string> LoadFirstNames(string json) 
{ 
    JObject o = JObject.Parse(json); 
    List<string> firstNames = new List<string>(); 
    foreach(var token in o.GetPropertyValues()) 
    { 
    FindFirstName(token, firstNames); 
    } 

    return firstNames; 
} 

private void FindFirstName(JToken currentProperty, List<string> firstNamesCollection) 
{ 
    if(currentProperty == null) 
    { 
    return; 
    } 

    if(currentProperty["firstName"] != null) 
    { 
     firstNamesCollection.Add(currentProperty["firstName"]); 
    } 

    foreach(var token into currentProperty.Values()) 
    { 
    FindFirstName(token , firstNamesCollection); 
    } 

} 
+0

Это привело меня к правильному ответу, хотя я все еще получал исключения при проверке того, было ли значение нулевым и оно не существовало с динамическим объектом, поэтому пришлось создать метод для переноса try ... catch и return false, если произошла ошибка. – user351711

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