使用XPath样式访问Javascript JSON对象属性
Access Javascript JSON object properties with XPath style
我有一个Java脚本Object,需要根据JSONPath
动态读取、写入和删除值。
有JavaScript库吗?
我知道有jsonpath.js,但这只是为了获取基于JSONPath
的值或对象。请帮忙。
一个例子:
假设我有这个JavaScript对象
var someData = {
store: {
book: [{
category: "fiction",
author: "Herman Melville",
title: "Moby Dick",
isbn: "0-553-21311-3",
price: 8.99
}, {
category: "fiction",
author: "some Author"
title: "The Lord of the Rings",
isbn: "0-395-19395-8",
price: 22.99
}],
}
}
我有一个JSONPath = $.store.book[0].author
该CCD_ 4每次都变化。所以这个JSONPath
指向了作者赫尔曼·梅尔维尔让我们假设要替换的值是"name2",我如何动态地执行它。
最坏的情况是
如果JSONPath = $.store.book[*].author
看到0被*替换,这意味着它指向数组书中的所有作者。
所以我应该能够读写作者的名字。
jsonpath.js执行读取功能,但不执行其他任何功能。
如果我不清楚,请评论。
您可以尝试以下操作https://lodash.com/docs#set
这里有一个例子:
var object = { 'a': [{ 'b': { 'c': 3 } }] };
lodash.set(object, 'a[0].b.c', 4);
console.log(object.a[0].b.c);
l33teral可能会有所帮助,但它不使用JSONPath。您可以在访问之前"探测"可能存在的路径。披露:我是作者。
这里有一个可能的解决方案,可以将数据存储在JSONPath解析的json中我在这里使用强大的javascript eval
:
function jsonPath(obj,expr,arg){var P={resultType:arg&&arg.resultType||"VALUE",result:[],normalize:function(e){var t=[];return e.replace(/['[']('??'(.*?'))[']']/g,function(e,r){return"[#"+(t.push(r)-1)+"]"}).replace(/'?'.'?|'['?/g,";").replace(/;;;|;;/g,";..;").replace(/;$|'?']|'$/g,"").replace(/#([0-9]+)/g,function(e,r){return t[r]})},asPath:function(e){for(var t=e.split(";"),r="$",a=1,n=t.length;n>a;a++)r+=/^[0-9*]+$/.test(t[a])?"["+t[a]+"]":"['"+t[a]+"']";return r},store:function(e,t){return e&&(P.result[P.result.length]="PATH"==P.resultType?P.asPath(e):t),!!e},trace:function(e,t,r){if(e){var a=e.split(";"),n=a.shift();if(a=a.join(";"),t&&t.hasOwnProperty(n))P.trace(a,t[n],r+";"+n);else if("*"===n)P.walk(n,a,t,r,function(e,t,r,a,n){P.trace(e+";"+r,a,n)});else if(".."===n)P.trace(a,t,r),P.walk(n,a,t,r,function(e,t,r,a,n){"object"==typeof a[e]&&P.trace("..;"+r,a[e],n+";"+e)});else if(/,/.test(n))for(var l=n.split(/'?,'?/),s=0,c=l.length;c>s;s++)P.trace(l[s]+";"+a,t,r);else/^'(.*?')$/.test(n)?P.trace(P.eval(n,t,r.substr(r.lastIndexOf(";")+1))+";"+a,t,r):/^'?'(.*?')$/.test(n)?P.walk(n,a,t,r,function(e,t,r,a,n){P.eval(t.replace(/^'?'((.*?)')$/,"$1"),a[e],e)&&P.trace(e+";"+r,a,n)}):/^(-?[0-9]*):(-?[0-9]*):?([0-9]*)$/.test(n)&&P.slice(n,a,t,r)}else P.store(r,t)},walk:function(e,t,r,a,n){if(r instanceof Array)for(var l=0,s=r.length;s>l;l++)l in r&&n(l,e,t,r,a);else if("object"==typeof r)for(var c in r)r.hasOwnProperty(c)&&n(c,e,t,r,a)},slice:function(e,t,r,a){if(r instanceof Array){var n=r.length,l=0,s=n,c=1;e.replace(/^(-?[0-9]*):(-?[0-9]*):?(-?[0-9]*)$/g,function(e,t,r,a){l=parseInt(t||l),s=parseInt(r||s),c=parseInt(a||c)}),l=0>l?Math.max(0,l+n):Math.min(n,l),s=0>s?Math.max(0,s+n):Math.min(n,s);for(var o=l;s>o;o+=c)P.trace(o+";"+t,r,a)}},eval:function(x,_v,_vname){try{return $&&_v&&eval(x.replace(/@/g,"_v"))}catch(e){throw new SyntaxError("jsonPath: "+e.message+": "+x.replace(/@/g,"_v").replace(/'^/g,"_a"))}}},$=obj;return expr&&obj&&("VALUE"==P.resultType||"PATH"==P.resultType)?(P.trace(P.normalize(expr).replace(/^'$;/,""),obj,"$"),P.result.length?P.result:!1):void 0}
var console = {
log: function(s) {
s = s.replace(/''n/, '<br/>');
document.getElementById("console").innerHTML += s + "<br/>"
}
}
var someData = {
store: {
book: [{
category: "fiction",
author: "Herman Melville",
title: "Moby Dick",
isbn: "0-553-21311-3",
price: 8.99
}, {
category: "fiction",
author: "some Author",
title: "The Lord of the Rings",
isbn: "0-395-19395-8",
price: 22.99
}],
}
}
jsonPathStore = function(obj,path,values) {
var maps=jsonPath(obj, path,{resultType:"PATH"})
maps.map(function(item,index) {
return eval( '(' + item.replace(/'$/,"obj") + '="' + values[index] +'"' + ')' );
})
}
jsonPathDelete = function(obj,path) {
var maps=jsonPath(obj, path,{resultType:"PATH"})
maps.map(function(item,index) {
return eval( '(' + 'delete ' + item.replace(/'$/,"obj") + ')' );
})
}
jsonPathRead = function(obj,path) {
var maps=jsonPath(obj, path,{resultType:"PATH"})
return maps.map(function(item,index) {
return eval( '(' + item.replace(/'$/,"obj") + ')' );
})
}
console.log( "JSON "+JSON.stringify(someData, null, 2) )
console.log( "jsonPathRead " + JSON.stringify(jsonPathRead(someData,"store.book[*].title"), null, 2) )
jsonPathStore(someData,"store.book[*].author", ["Loreto", "Loreto Parisi"])
console.log( "jsonPathStore " + JSON.stringify(someData, null, 2) )
jsonPathStore(someData,"store.book[*].title", ["JavaScript", "Ninja"])
jsonPathDelete(someData,"store.book[*].price")
console.log( "jsonPathDelete " + JSON.stringify( eval("(" + "someData" + ")" ), null, 2) )
<div id="console" />
函数jsonPathStore
包含3个参数、json对象、类似xpath的字符串和一个替换数组。函数jsonPathDelete
接受两个参数,json对象和类似xpath
的字符串。它将删除所有匹配的密钥。
这是一个通用的解决方案,可以进行改进以处理特定的情况。
相关文章:
- jQuery匹配JSON对象的部分文本
- 如何在Javascript中将JSon对象转换为数组
- 我可以在json对象中添加一个函数吗
- 使用JS将数组转换为json对象
- 如何为json对象中的段发送array[]
- 将JSON对象传递给angular指令
- 更改JSON对象的结构
- 访问JSON对象内部的数组元素
- 在ejs-partial中对JSON对象进行迭代
- 遍历 JSON 对象并检查 URL 是否以某个值结尾
- 访问嵌套JSON对象的键,其中键是动态的
- json对象中缺少对象循环
- 发送json对象或使用express路由呈现视图
- 在play2框架中向json对象添加下拉列表项
- 元素名称上带有短划线 (-) 字符的 Json 对象
- autocomplete不接受源的json对象
- 如何在javascript中创建动态json对象
- 在使用客户端脚本时拾取JSON对象
- 如何通过json对象数组为嵌套对象赋值
- 构造JSON对象