如何将字符串转换为JSONPath

时间:2014-12-23 21:54:51

标签: javascript json jsonpath

我有一个JSON对象,里面有几个嵌套级别。

我得到一个字符串,指的是特定对象的位置。

例如,如果我的JSON对象看起来像:

countries: [
     canada: {
          capital: "ottawa",
          territories: [
               yukon: {
                    capital: "yellowknife",
                    ...
               }
               ...
          ]
          ...
     }

我给了字符串

"countries.canada.territories.yukon"

我想获得Yukon的对象。

我该怎么做?

4 个答案:

答案 0 :(得分:0)

可能不是最有效的方式,但它有效。

var n= {JSON};
var c="countries.canada.territories.yukon".split('.');
var p=n;
for(var i=0;i<c.length;i++){
   p=p[c[i]];
}
console.log(p);// p is your Yukon Element

如果要编辑元素,请使用eval函数:

var myJSON= {JSON};
var c="countries.canada.territories.yukon";
c='myJSON["'+c+'"]';
c.replace(/\./g,'"]["');
eval(c+'={COOL_JSON_CODE}')
console.log(myJSON);// the Yukon element has cool new json code in it now

答案 1 :(得分:0)

我想出了一种让它发挥作用的方法。它看起来并不正确#34;但它仍然是一个答案。 (我将标记为接受任何比这更好的答案)

for (var key in currentObject){
       delete currentObject[key];
}

这清除了Yukon对象。

更新了小提琴:http://jsfiddle.net/ay1wpr5L/3/

答案 2 :(得分:0)

我用这个,

function jsonPathToValue(jsonData, path) {
    if (!(jsonData instanceof Object) || typeof (path) === "undefined") {
        throw "InvalidArgumentException(jsonData:" + jsonData + ", path:" + path);
    }
    path = path.replace(/\[(\w+)\]/g, '.$1'); // convert indexes to properties
    path = path.replace(/^\./, ''); // strip a leading dot
    var pathArray = path.split('.');
    for (var i = 0, n = pathArray.length; i < n; ++i) {
        var key = pathArray[i];
        if (key in jsonData) {
            if (jsonData[key] !== null) {
                jsonData = jsonData[key];
            } else {
                return null;
            }
        } else {
            return key;
        }
    }
    return jsonData;
}

测试,

json = {"a1":{"a2":{"a3":"value"}}};
console.log(jsonPathToValue(json, "a1.a2.a3")); //=> shows: value

灵感来自here

答案 3 :(得分:0)

您可以使用 javascript 的 eval 函数来评估最终结果,解决方案看起来像这样

let countriesObj = {<your json object>}
let path = "countries.canada.territories.yukon";
let properties = path.split(".");
let propertyStr = "";
for(let property in properties){
    propertyStr+="['"+properties[property]+"']"
}

let result = undefined;
let expression = "result = countriesObj"+propertyStr+";";
eval(expression);
return result;

这会给你确切的结果

相关问题