在Node.js中解析JSON树

3

我需要解析一个放在文件中的JSON,并识别其结构。下面是我尝试做到这一点的代码:

var fs = require('fs')
var reqTemplate;
var obj;
fs.readFile('SampleData.js', 'utf8', function (err, data) {
    if (err) {
        return console.log(err);
    }
    reqTemplate = data;
    console.log('\nRequestTemplate:\n\n%s\n', reqTemplate);
    obj = JSON.parse(reqTemplate);
    var i = 0;
    console.log(Object.keys(obj));
    Object.keys(obj).forEach(function (key) {
        i++;
        console.log;
        console.log(key);
        console.log(obj[key]);
    });
});

我得到的输出是:
{
    "AuthenticateUserReq": {
        "Tid": "123",
        "username": "131329",
        "password": "Vinod",
        "SessionTokenId": "",
        "DeviceInfo": {
            "DeviceName": "ABC",
            "DeviceVersion": "X",
            "UniqueDeviceID": "ZZZ",
            "Platform": "AND"
        }
    }
}

我能够获取父级键及其值。
但我不知道如何识别子键并检索其值。

PS:我不知道json响应的结构。我需要识别根键及其值,以及子键及其值。

任何帮助都将不胜感激。


为什么需要手动迭代对象? 你需要的对象不是简单地 JSON.parse(reqTemplate) 吗? - Cerbrus
@Cerbrus: 那只是给了我整个响应。我想要获取各个键及其值。 - Amanda G
啊,我明白了。Bergi的答案就是那个 :P - Cerbrus
3个回答

4
你需要使用递归完成树遍历,详情请参考
var callback = console.log;

function traverse(obj) {
    if (obj instanceof Array) {
        for (var i=0; i<obj.length; i++) {
            if (typeof obj[i] == "object" && obj[i]) {
                callback(i);
                traverse(obj[i]);
            } else {
                callback(i, obj[i])
            }
        }
    } else {
        for (var prop in obj) {
            if (typeof obj[prop] == "object" && obj[prop]) {
                callback(prop);
                traverse(obj[prop]);
            } else {
                callback(prop, obj[prop]);
            }
        }
    }
}

traverse( JSON.parse(reqTemplate) );

谢谢,我尝试了您的解决方案,并成功得到了所需的输出。 - Amanda G

2

你可能还想尝试一下Node traverse - https://github.com/substack/js-traverse。它允许递归地遍历JSON树以获取每个键值对及其上下文(即:跟踪父级),并且可以在遍历树时运行map/reduce。非常强大。


0
当您解析JSON时,会得到一个普通的JS对象。您可以使用var keysOfObject = Object.keys(object);获取其键。然后,您可以使用这些键来获取值。

当我尝试这样做时,我只能获取上述JSON中的父键AuthenticateUserReq。但我也想获取DeviceInfo(即)父键内部的主键未在上述方法中检索到。 - Amanda G
但是你的目的是什么?为什么要遍历JSON?是在寻找某些东西吗?还是只想将其打印出来? - sqreept
我想遍历JSON存储,将其键存储在数据库中,并且我应该能够通过从数据库检索其内容来将JSON带回其原始格式。 - Amanda G

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接