【问题标题】:How Do I iterate through nested properties of Json in nodejs?如何在nodejs中遍历Json的嵌套属性?
【发布时间】:2017-08-07 05:07:09
【问题描述】:

我有一个具有三层嵌套的 json 对象,我必须动态迭代它

这是我的代码

var responseObj ={ 
           db_config:{
             db_user: 'das1234',
            },
           env_con:{
             db_con:'ds67'
           },
           db_password: 'ds345ty76',
           db_host: 'wdsa12'
          }    


        function decrypt(responseObj,key){  
            var list = []
            //get the keys from the responseObj 
            Object.keys(responseObj).forEach(function(key){
                    //Push the keys into a list
                    list.push(key);
                })
            console.log(list)

            try{
                for(var i =0;i<list.length;i++){
                    //Decrypt the values of the key
                    var decipher = crypto.createDecipher('aes256', key);
                    //Assign The decrypted value to the keys
                    responseObj[list[i]] = decipher.update(responseObj[list[i]], 'hex', 'utf8') + decipher.final('utf8')
                }
                return responseObj;

            }catch(err){
                console.log(err);
            }   
        }  


    var res = decrypt(responseObj,key)
    console.log(res)

尝试了很多方法,我只是混淆了如何在不使用静态键的情况下动态迭代获取键和值。 有任何想法请帮助找出来。

【问题讨论】:

  • “我如何在 nodejs 中遍历 Json 的嵌套属性?” 你没有。 JSON 是一种用于数据交换的文本表示法。(stackoverflow.com/a/2904181/157247) 如果您处理的是 JavaScript 源代码,而不是处理 字符串,那么您就不是在处理与 JSON。 [(More.)] 你可以遍历对象树的嵌套属性,当你 parse 它时,你将不再处理 JSON。但是问题中根本没有JSON,所以不需要解析。
  • 您已经获得了密钥并使用它们来查找对象的属性。你被困在哪里了?您似乎具备上述基础知识。
  • Crowder 尝试以这种形式获取 json 的解决方案时你是对的,我可以在这里是 Json let responseObj = { db_user: 'das1234', db_con:'ds67', db_password: 'ds345ty76' , db_host: 'wdsa12', } 但是如果 Json 是嵌套的,我该如何进一步处理?
  • 再说一遍:这不是 JSON。这只是一个 JavaScript 对象初始化器。

标签: javascript json node.js loops iteration


【解决方案1】:

你已经拥有了几乎所有的部分。您知道如何从对象中获取属性名称(键):

Object.keys(obj);

...以及如何遍历它们

.forEach(...)

唯一缺少的部分是 recursion 并检测到属性的值是另一个对象。您可以使用typeof 测试taht:typeof something === "object" 告诉我们something 是一个对象(或null)。

见 cmets:

var responseObj = {
    db_config: {
        db_user: 'das1234',
    },
    env_con: {
        db_con: 'ds67'
    },
    db_password: 'ds345ty76',
    db_host: 'wdsa12'
};

function decrypt(obj, key) {
    // Loop through this object's properties
    Object.keys(obj).forEach(function(key) {
        // Get this property's value
        var value = obj[key];
        // If not falsy (null, empty string, etc.)...
        if (value) {
            // What is it?
            switch (typeof value) {
                case "object":
                    // It's an object, recurse
                    decrypt(value, key);
                    break;
                case "string":
                    // It's a string, decrypt
                    var decipher = crypto.createDecipher('aes256', key);
                    obj[key] = decipher.update(value, 'hex', 'utf8') + decipher.final('utf8');
                    break;
            }
        }
    })
}

var res = decrypt(responseObj, key);
console.log(res);

【讨论】:

    【解决方案2】:

    让我们首先澄清一下 JSON 究竟是什么。 JSON是一个文本, 与语言无关的数据交换格式,很像 XML、CSV 或 YAML。

    来源:What is the difference between JSON and Object Literal Notation?

    蜜蜂说您的问题是关于在不调用键的情况下迭代对象本身。你正在寻找这个:

    for (variable in object) {... }
    

    这是一个来自 MDN 的示例:

    let obj = {a:1, b:2, c:3};
    
    for (let prop in obj) {
      console.log("o." + prop + " = " + obj[prop]);
    }
    

    来源:https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Statements/for...in


    旁注

    我不知道你想用你的 JSON 结构实现什么,但你可以改变你的 JSON:

    var responseObj ={ 
               db_config:{
                 db_user: 'das1234',
                },
               env_con:{
                 db_con:'ds67'
               },
               db_password: 'ds345ty76',
               db_host: 'wdsa12'
              }   
    

    到这里:

    let responseObj = { 
               db_user: 'das1234',
               db_con:'ds67',
               db_password: 'ds345ty76',
               db_host: 'wdsa12',
               }
    

    新的 JSON 将是扁平的,您不必担心遍历嵌套对象。

    例子:

    for (let prop in responseObj ) {
      console.log("o." + prop + " = " + responseObj [prop]);
    }
    

    【讨论】:

    • ,谢谢,但是我必须迭代我提到的Json,因为我只得到了这种形式的响应。我试图用它来迭代解密json值。
    • 您可以在循环中进行另一次内部检查,例如:if ( typeof responseObj [prop] === 'object'(注意 typeof)。然后再做一次for (variable in object) {... }(递归)。之后,只需返回您想要的值。另一种选择是在迭代之前将给定的 JSON 展平。 SO上有几个选项。
    猜你喜欢
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 2022-01-01
    • 2016-09-15
    • 2019-11-11
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    相关资源
    最近更新 更多