点击密钥时的JSONPath语法

时间:2016-10-22 00:46:23

标签: json jsonpath

如果我使用不正确的术语,请原谅我,我是新手。

我有一些简单的JSON:

{
"properties": {
    "footer.navigationLinks": {
        "group": "layout"
    ,   "default": [
            {
                "text": "Link a"
            ,   "href": "#"
            }
        ]
    }
}

我正在尝试查明“footer.navigationLinks”,但我在密钥名称中遇到问题。我正在使用http://jsonpath.com/,当我进入

$.properties['footer.navigationLinks']

我得到'不匹配'。如果我将密钥更改为“footernavigationLinks”,它可以工作,但我无法控制JSON文件中的密钥名称。

请有人帮我定位该关键名称吗?

3 个答案:

答案 0 :(得分:1)

此问题在2007年报告为issue #4 - Member names containing dot fail并已修复。

此在线jsonpath.com implementation中的修复程序,但它已在this old archive中修复,可能在此后创建的大多数分支中已修复(如{{{{ 3}}和here)。

有关错误的详细信息

对错误和2007年修正版本的代码进行比较,发现修正是在私人normalize函数中进行的。

在2007年更正的版本中,它显示:

normalize: function(expr) {
    var subx = [];
    return expr.replace(/[\['](\??\(.*?\))[\]']|\['(.*?)'\]/g, function($0,$1,$2){
        return "[#"+(subx.push($1||$2)-1)+"]";
    })  /* http://code.google.com/p/jsonpath/issues/detail?id=4 */
    .replace(/'?\.'?|\['?/g, ";")
    .replace(/;;;|;;/g, ";..;")
    .replace(/;$|'?\]|'$/g, "")
    .replace(/#([0-9]+)/g, function($0,$1){
         return subx[$1];
    });
},

该序列中的第一个和最后一个replace确保第二个replace不会将属性名称中的某个点解释为属性分隔符。

我查看了自那时以来制作的更新的叉子,并且代码自那时起发生了巨大的变化。

结论:

here基于过时的JSONPath版本,对于预览当前库将为您提供的内容不可靠。

答案 1 :(得分:1)

有一个json回复:

{
  "0": {
    "SKU": "somevalue",
    "Merchant.Id": 234
    }
}

我可以用一个键来定位一个键。 (点)在名称中。

jsonPath.getJsonObject("0.\"Merchant.Id\"")

注意:引号及其转义的事实。

注意不确定其他版本,但我正在使用

  

'com.jayway.restassured',名称:'json-path',版本:'2.9.0'

我见过的一些样本/解决方案,使用带括号的单引号,但对我不起作用。

答案 2 :(得分:0)

有关信息,jsonpath.com已自提出问题以来进行了修补,现在适用于问题中给出的示例。我成功尝试了这些路径:

  • $.properties['footer.navigationLinks']
  • $.properties.[footer.navigationLinks]
  • $.properties.['footer.navigationLinks']
  • $['properties']['footer.navigationLinks']
  • $.['properties'].['footer.navigationLinks']
  • properties.['footer.navigationLinks']