2016-02-25 4 views
0

Я пытаюсь написать выражение пути JSON, чтобы извлечь все карты и подкладки из структуры JSON. Учитывая JSON:Путь JSON - извлечь все карты

{ 
    "k1":"v1", 
    "arr": ["1","2","3" ,["7","8"] ], 
    "submap": 
    { 
    "a":"b", 
    "c":"d" 
    }, 
    "submap_2": 
    { 
    "a_2":"b", 
    "c_2":"d", 
    "nested": { "x":"y" } 
    } 
} 

Я хочу, чтобы извлечь элементы "submap", "submap_2", "nested".

Я пробовал JSONPath такие выражения, как:

$..*[?(@.length()>0 && @.*[0] empty true)] 

Это возвращает структуры, которые я хочу, но и возвращает [ "7","8" ]. Есть ли способ сделать это с помощью JSONPath или это лучше сделать в коде?

(опрятная инструменты тестирования JSONPath здесь: http://jsonpath.herokuapp.com/)

(Конкретная реализация, что я использую это один: https://github.com/jayway/JsonPath)

ответ

0

JQ запросы часто очень похожи на запросы JSONPath, и я настоятельно рекомендую, чтобы, если это вообще возможно, вы можете использовать jq.

Предполагая, данные примера в файл с именем example.json, следующий вызов JQ выдает результат запрошенные:

$ jq 'path(.. | select(type=="object")) | .[-1] | select(.)' example.json 
"submap" 
"submap_2" 
"nested" 

Выход первого фильтра (path(....)) состоит из полных выражений маршрута путей ко всем объектам JSON, включая сам объект верхнего уровня. Остальные фильтры необходимы для получения точного результата, который вы запросили. На практике, однако, все возможные выражения пути, вероятно, более полезны, поэтому вам может быть полезно увидеть результат, полученный первым фильтром:

$ jq -c 'path(.. | select(type=="object"))' example.json 
[] 
["submap"] 
["submap_2"] 
["submap_2","nested"] 
+0

Имеет ли jq API, который я мог бы использовать? Мне кажется, что это только инструмент командной строки, хотя, возможно, я что-то пропустил. Я использую JSONPath из Java-приложения. – FrustratedWithFormsDesigner

+0

Я успешно использовал Runtime.getRuntime(). Exec (cmd); с 'jq', но я считаю, что потребуется некоторое время, чтобы использовать JNI для доступа к API API jq. Элементы - см. Https://github.com/stedolan/jq/wiki/C-API:-jq-program-invocation; вам может понадобиться создать билет на странице https://github.com/stedolan/jq/issues – peak

+0

Кто-то сделал jq в модуль Python: https://pypi.python.org/pypi/jq – peak