3

I want to access a nested JSON dictionary via dynamically constructed keypath.
The keypath uses standard JSON dot and subscript operators. (. and [x])
E.g.:

var data = 
{"title": "a_title",
 "testList": [
   {
     "testListItemKey": "listitem1"
   },
   {
     "testListItemKey": "listitem2",
          "deepTestList": [
            {
              "testListItemKey": "listitem1",
                      "testListItemDict":{
                         "subTitle": "sub_title",
                      }
            }]
   }]
}

An example keypath string would be:

data.feedEntries[0].testList[2].deepTestList[1].testListItemDict.subTitle  

The simplest working solution I found so far is to use eval or function constructors:

function valueForKeypPath(data, keyPath) {
    "use strict";
    var evaluateKeypath = new Function('data', 'return data.' + keyPath);
    return evaluateKeypath(data);
}

As I can't fully trust the JSON data I receive from a remote endpoint, I'd like to avoid eval et.al.

2

2 Answers 2

5

Replace all "[" to "." and "]" to "" so you get to

feedEntries.0.testList.2.deepTestList.1.testListItemDict.subTitle

Split this into a path array like using path.split('.')

var paths =  ['feedEntries','0','testList','2']

then just

var root = data;
paths.forEach(function(path) {
   root = root[path];
});

at the end root contains the desired data fragment.

Sign up to request clarification or add additional context in comments.

Comments

0

What if you are using "underscore", I recommend underscore-keypath

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.