4

How would you get a JSONPath to all child node of an object?

E.g.:

var data = [{
    "key1": {
        "children": [{
            "key2": "value",
            "key3": "value",
            "key4": {}
        }, {
            "key2": "value",
            "key3": "value",
            "key4": {}
        }],
        "key5": "value"
    }
}, {
    "key1": {
        "children": {
            "key2": "value",
            "key3": "value",
            "key4": {}
        },
        "key5": "value"
    }
}]

I want to get absolute path for all nodes in the data structure as an array:

[
    "data[0]['key1']['children'][0]['key2']", 
    "data[0]['key1']['children'][0]['key3']", 
    "data[0]['key1']['children'][0]['key4']", 
    ......, 
    "data[0]['key1']['children'][1]['key2']",
    ......., 
    "data[1]['key1']['children']['key2']",
    ..........
]

Is there any way to get this done in JS?

10
  • Yes, I suppose there are many ways to do it... Where did you get stuck? Commented Sep 5, 2013 at 6:40
  • Ok, I understand the term "JSONPath" (based on the tag description, it makes sense (the comparison between to XPath and XML seems appropriate)). But you are not working with JSON in your example, hence I will edit your question accordingly. Commented Sep 5, 2013 at 6:42
  • I'm confused in how to right the recursive function. Commented Sep 5, 2013 at 6:42
  • Does this help? code.google.com/p/jsonpath Commented Sep 5, 2013 at 6:43
  • You might want to have a look at stackoverflow.com/questions/11922383/…. Commented Sep 5, 2013 at 6:47

2 Answers 2

5

I wrote a custom code that gives us JSON path of all nodes as array

function toArray(obj, name) {
    var result = [];
    var passName;
    var tempArray = [];
    for (var prop in obj) {
        var value = obj[prop];
        if (typeof value === 'object') {
            if ($.isNumeric(prop)) {
                passName = name + "[" + prop + "]";
            } else {
                passName = name + "['" + prop + "']";
            }
            tempArray = toArray(value, passName);
            $.each(tempArray, function (key, value) {
                result.push(value);
            });

        } else {
            result.push(name + "['" + prop + "']");
        }
    }
    return result;
}

JS Fiddle

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

Comments

3

well , I think you have to loop through your entire json structure..

  for(var i=0; i<data.length; i++) {
     for(var j in data[i]){
       //and so on
      }
   }

Or simply you can create aleas arrary for every key where key will be the path of that value with "_" as separator like..

 var aleasArray = []; 
 for(var i=0; i<data.length; i++) {
     for(var j in data[i]){
      aleasArray[i + '_' + j] = data[i][j];  // if you want make it more generalize aleas array..
      }
   }

hope this will help you..

1 Comment

What about the path of nested arrays

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.