使用JSONPath从JSON对象获取单个值

时间:2014-05-12 11:40:48

标签: json jsonpath

我有以下JSON,我需要使用JSONPath获取普通name值:

{
  "single" : {
    "id" : 1, 
    "name" : "Item name"
  }
}

我使用的表达式是$.single.name,但我总是得到一个数组:

[ "Item name" ]

而不是字符串值("Item name")。

5 个答案:

答案 0 :(得分:14)

但我总是得到一个数组:

这意味着要发生。您可以在this documentation中阅读“结果”(几乎在底部):

  

请注意,jsonPath的返回值是一个数组,即   也是一个有效的JSON结构。所以你可能想要应用jsonPath   再次得到的结构或使用您最喜欢的数组之一   用它排序的方法。

所以基本上它总会返回一个数组。如果您需要将数据作为其他类型,例如在这种情况下,你将不得不自己进行转换。

答案 1 :(得分:7)

我正在使用JSONPath的Java implementation并遇到了同样的问题。对我有用的是添加' [0]'到json路径字符串。所以在你的情况下:

$.single.name[0]

答案 2 :(得分:0)

我知道这是一个老问题,但是在为Spring Boot应用程序编写单元测试时,以下对我有用。希望这对处于类似情况的人有所帮助。

如Tim Castelijns所述,结果始终是一个数组。

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"))).

答案 3 :(得分:0)

我认为,这取决于语言的实现。

例如在nodejs中,有一个npm模块:https://www.npmjs.com/package/jsonpath

其中有一个名为 value 的方法,该方法正是我们所需要的

jp.value(obj,pathExpression [,newValue])

  
    

返回与pathExpression匹配的第一个元素的值。如果提供了newValue,则设置第一个匹配元素的值并返回新值。

  

我尝试过并且工作了!

答案 4 :(得分:0)

如果您遇到此错误

<块引用>

“无法获得表达式 $.yourfield 的标量值”

您只需通过将返回类型属性值更改为 'json' 而不是 'auto 来配置 EvaluateJsonPath 处理器-检测'

enter image description here