Получение единственного значения из объекта 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, задает значение первого соответствующего элемента и возвращает новое значение.

Я попробовал это и сработало!