Javascript 如何将字符串转换为JSONPath

Javascript 如何将字符串转换为JSONPath,javascript,json,jsonpath,Javascript,Json,Jsonpath,我有一个JSON对象,其中有几个嵌套级别 我得到了一个字符串,该字符串表示特定对象的位置 例如,如果我的JSON对象看起来像: countries: [ canada: { capital: "ottawa", territories: [ yukon: { capital: "yellowknife", ...

我有一个JSON对象,其中有几个嵌套级别

我得到了一个字符串,该字符串表示特定对象的位置

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

countries: [
     canada: {
          capital: "ottawa",
          territories: [
               yukon: {
                    capital: "yellowknife",
                    ...
               }
               ...
          ]
          ...
     }
我得到了线索

"countries.canada.territories.yukon"
我想得到育空地区的物体


我怎样才能做到这一点呢?

可能不是最有效的方法,但它确实有效

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

我想出了一个办法让它发挥作用。这似乎不“正确”,但它仍然是一个答案。(我会将比这更好的答案标记为已接受)

这将清除育空对象

更新的小提琴:

我用这个

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;
}

受。

启发,您可以使用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;
let countriesObj={}
让path=“countries.canada.territies.yukon”;
让properties=path.split(“.”);
let propertyStr=“”;
for(让属性包含在属性中){
propertyStr+=“[”+属性[属性]+“]”
}
让结果=未定义;
让expression=“result=countriesObj”+propertyStr+”;”;
eval(表达式);
返回结果;

这将为您提供准确的结果

唯一的问题是,它提供的是对象的值,而不是引用。我不能用
p
更新对象,我觉得一定有更好的方法来更新对象
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
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;