2014-12-23 3 views
0

У меня есть объект JSON, в котором есть несколько вложенных уровней.Как преобразовать строку в JSONPath

Мне дана строка, которая ссылается на местоположение конкретного объекта.

Например, если мой объект JSON выглядел как:

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

и я дал строковое

"countries.canada.territories.yukon" 

Я хочу, чтобы получить объект для Юкона.

Как я могу это сделать?

ответ

0

Я придумал способ заставить его работать. Это не кажется «правильным», но это все еще ответ. (Я буду отмечать как принятый ответ лучше этого)

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

Это очищает объект Юкон.

Обновлено скрипку: http://jsfiddle.net/ay1wpr5L/3/

+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 
+0

Единственная проблема заключается в том, что он дает мне значение объекта, но не ссылку. Я не могу обновить объект с помощью 'p' – CodyBugstein

+0

Я обновил свой ответ –

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.

 Смежные вопросы

  • Нет связанных вопросов^_^