2015-06-01 3 views
0

У меня есть JSON, который должен соответствовать этому стандарту.Querying complex json

{ 
    "level": [ 
    { 
     "1": { 
     "Title": "My First Title", 
     "Body": "My First Body" 
     } 
    }, 
    { 
     "2": { 
     "Title": "My Second Title", 
     "Body": "My Second Body" 
     } 
    } 
} 

Хотя я знаю, что это не лучший формируется JSON в мире, он должен остаться как это для интеграции в комплексную систему. Мне не удалось найти способ запросить все на «первом уровне». Мне нужно только отключить json клавишами «1», «2», «3».

SQL-equivilant будет:

SELECT Title, Body FROM level WHERE level.id = 1. 

Я изо всех сил, потому что нет идентификатор. ключ - это идентификатор, поэтому я не знаю, что искать.

Возвращается JSON должен быть:

{ 
    "Title": "My First Title", 
    "Body": "My First Body" 
} 
+5

'json.level [0] [ "1"] title' – adeneo

+0

@adeneo но сначала он должен был бы искать объект' уровень [0] 'для ключа' "1" '. –

ответ

1

Это возвращает Array со спичками:

var queryID = "1"; 

yourJSON.level.filter(function(row){ return queryID in row; }) 
+1

В ситуации ОП, возможно, больше, чем в моей альтернативе. :) – Tomalak

0

Так как вы воспитывали SQL ... Вы можете использовать linq.js

var data = { 
    "level": [ 
    { 
     "1": { 
     "Title": "My First Title", 
     "Body": "My First Body" 
     } 
    }, { 
     "2": { 
     "Title": "My Second Title", 
     "Body": "My Second Body" 
     } 
    } 
    ] 
}; 

Теперь, например:

var result = Enumerable.From(data.level) 
    .Where("$.hasOwnProperty(1)") 
    .FirstOrDefault(null); 

result; 
// {"1":{"Title":"My First Title","Body":"My First Body"}} 

или

var result = Enumerable 
    .From(data.level) 
    .Select(function ($) { 
     var keys = Object.keys($); 
     return { 
      id: keys[0], 
      value: $[keys[0]] 
     }; 
    }) 
    .Where("$.id == 1") 
    .Select("$.value") 
    .FirstOrDefault(null); 

result; 
// {"Title":"My First Title","Body":"My First Body"} 
0

Я предполагаю, что вы хотите, чтобы все, что в массиве объектов:

var levels = []; 
json["level"].forEach(function (val) { 
     Object.keys(val).forEach(function (key) { 
      levels[key] = val[key]; 
     }); 
}); 

теперь, если вы запрашиваете уровень [ID] вы должны получить желаемый результат.

Смотрите этот пример:. https://jsfiddle.net/c2vk5c6m/