Получение единственного значения из объекта JSON с использованием JSONPath
У меня есть следующий JSON, и мне нужно получить значение plain name
, используя JSONPath:
{
"single" : {
"id" : 1,
"name" : "Item name"
}
}
Выражение, которое я использовал, это $.single.name
, но я всегда получаю массив:
[ "Item name" ]
вместо строкового значения ("Item name"
).
Ответы
Ответ 1
но я всегда получаю массив:
Это должно произойти. Как вы можете прочитать эту документацию в разделе "Результат" (почти внизу):
Обратите внимание, что возвращаемое значение jsonPath - это массив, который также действительная структура JSON. Поэтому вы можете применить jsonPath к результирующая структура снова или использовать один из ваших любимых массивов методы сортируются с ним.
Таким образом, он всегда будет возвращать массив. Если вам нужны данные как другие типы, например. Строка в этом случае, вам придется сделать преобразование самостоятельно, я боюсь.
Ответ 2
Я использовал Java-реализацию JSONPath и попал в ту же проблему. Для меня работало добавить '[0]' в строку json path. Итак, в вашем случае:
$.single.name[0]
Ответ 3
Я знаю, что это старый вопрос, но мне помогло следующее при написании юнит-теста для приложения с весенней загрузкой. Надеюсь, это поможет кому-то в подобной ситуации.
Как отметил Тим Кастелийнс, результатом всегда является массив.
Образец Json
{
"validationErrors": [
{
"field": "location",
"message": "must not be null"
},
{
"field": "address",
"message": "must not be blank"
},
{
"field": "id",
"message": "must be null"
},
{
"field": "name",
"message": "must not be blank"
}
]
}
и часть модульного тестирования
//verify if the id is validated for null
andExpect((ResultMatcher) jsonPath("$.validationErrors[?(@.field=='id')].message").isArray()).
andExpect((ResultMatcher) jsonPath("$.validationErrors[?(@.field=='id')].message",hasItem("must be null"))).
Ответ 4
Я думаю, это зависит от языковой реализации.
Например, в nodejs есть модуль npm: https://www.npmjs.com/package/jsonpath
Который имеет метод с именем value, который делает именно то, что нам нужно
jp.value(obj, pathExpression [, newValue])
Возвращает значение первого элемента, соответствующего pathExpression. Если задано newValue, задает значение первого соответствующего элемента и возвращает новое значение.
Я попробовал это и сработало!