Ale*_*lex 3 javascript php json jsonpath
我有一些JSON,其中以下是一个小样本:
{
"results": {
"div": [
{
"class": "sylEntry",
"div": [
{
"class": "sT",
"id": "sOT",
"p": "Mon 11/17, Computer work time"
},
{
"class": "des",
"id": "dOne",
"p": "All classes Siebel 0218"
}
],
"id": "sylOne"
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
我想只"p"用class 检索div元素的内容"sT".我想使用循环并执行以下操作:
var arrayOfResults = $.results..div.p
Run Code Online (Sandbox Code Playgroud)
不起作用,因为我只想用class检索div元素的p值"sT".
那么我该如何构造我的JSONpath以便它将检索divs类"sT"中包含的p元素数组.
谢谢!!
jas*_*p85 10
JSONPath显然有一个过滤器语法,允许您将任意Javascript插入表达式以进行匹配或过滤.它还@用作当前节点的快捷方式.他们将这两件事结合起来的例子如下:
$ .. book [?(@.price <10)] //过滤所有低于10的书
所以这可能是你想在这里使用的.
为了测试我想到的查询,我修改了JSONPath的repo中的jsonpath-test-js.html文件来测试你的数据.您可以将我的示例复制粘贴到HTML文件中,然后将其加载到浏览器中.
他们的测试套件有一个对象数组,其中包含字段o和p.o包含要操作的原始数据,同时p包含要应用的JSONPath表达式数组o.它遍历所有这些对并将所有ps应用于它们各自的os,打印出结果.不像简单的REPL那样方便,但它会做到.
这是我想出的:
<html>
<head>
<title> JSONPath - Tests (js)</title>
<script type="text/javascript" src="http://www.json.org/json.js"></script>
<script type="text/javascript"
src="http://jsonpath.googlecode.com/svn/trunk/src/js/jsonpath.js">
</script>
</head>
<body>
<pre>
<script type="text/javascript">
var out = "", tests =
[ { "o": { "results" : { "div" : [ { "clazz": "sylEntry",
"id": "sylOne", "div": [ { "clazz": "sT", "id": "sOT",
"p": "Mon 11/17, Computer work time" }, { "clazz": "des",
"id": "dOne", "p": "All classes Siebel 0218" } ] } ] } },
"p": ["$.results..div[?(@.clazz=='sT')].p", // my suggestion expression
"$.results..div[*].p"]}, // your question's expression
];
function evaluate($, p) {
var res = eval(p);
return res != null ? res.toJSONString() : null;
}
for (var i=0; i<tests.length; i++) {
var pathes;
for (var j=0; j<tests[i].p.length; j++) {
pre = ">";
if (pathes = jsonPath(tests[i].o, tests[i].p[j], {resultType: "PATH"}))
for (var k=0; k<pathes.length; k++) {
out += pre + " " + pathes[k] +
" = " + evaluate(tests[i].o, pathes[k]) + "\n";
pre = " ";
}
}
out += "<hr/>";
}
document.write(out);
</script>
</pre>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
请注意,这将首先打印我的查询表达式的结果,然后打印您的结果,以便我们可以比较它们产生的结果.
这是它产生的输出:
> $['results']['div'][0]['div'][0]['p'] = "Mon 11/17, Computer work time"
> $['results']['div'][0]['div'][0]['p'] = "Mon 11/17, Computer work time"
$['results']['div'][0]['div'][4]['p'] = "All classes Siebel 0218"
Run Code Online (Sandbox Code Playgroud)
所以过滤器表达式中的正确运算符是==,意味着正确的表达式是:
$.results..div[?(@.class=='sT')].p
Run Code Online (Sandbox Code Playgroud)
但是,我发现了一个不幸的问题(至少在JSONPath的Javascript实现中):在上面的查询中使用"class"一词导致:
SyntaxError: jsonPath: Parse error: _v.class=='sT'
Run Code Online (Sandbox Code Playgroud)
我唯一的猜测是,有一个eval被称为某处的实体来评估JSONPath表达式.class是Javascript中的保留字,因此会导致问题.让我们尝试使用替代语法@.class:
$.results..div[?(@.['class']=='sT')].p
Run Code Online (Sandbox Code Playgroud)
结果:
> $['results']['div'][0]['div'][0]['p'] = "Mon 11/17, Computer work time"
> $['results']['div'][0]['div'][0]['p'] = "Mon 11/17, Computer work time"
$['results']['div'][0]['div'][5]['p'] = "All classes Siebel 0218"
Run Code Online (Sandbox Code Playgroud)
所以使用上面的表达式,你应该好好去!过滤器功能看起来很强大,所以它可能非常值得探索它的功能!
| 归档时间: |
|
| 查看次数: |
5483 次 |
| 最近记录: |