recherche

Maison  >  Questions et réponses  >  le corps du texte

javascript - À propos de l'obtention du nom de plusieurs clés imbriquées dans plusieurs paires clé-valeur en JSON

{
  "RuntimeSources": {
    "flask-webapp": {
      "eb-flask1.3": {
        "s3url": ""
      }
    }
  },
  "DeploymentId": 4,
  "Serial": 4
}

Il existe un tel fichier json. Maintenant, je dois extraire flask-webapp这个key的name,即flask-webappla chaîne elle-même. Comment dois-je l'utiliser ? En utilisant Object.keys(), j'obtiens les trois clés RuntimeSource, DeploymentId et Serial.
Je pense que ma description est un peu compliquée. Pour résumer, le problème est le suivant : comment extraire la clé dans la couche suivante de valeur-clé dans la première valeur-clé de ce fichier json (cela semble être plus compliqué... J'espère que vous pouvez le comprendre) )
Il peut être implémenté en utilisant python ou javascript

ringa_leeringa_lee2721 Il y a quelques jours877

répondre à tous(6)je répondrai

  • 黄舟

    黄舟2017-06-12 09:24:48

    function getFirstKeyInLevel(json, level) {
        var levelNow = 0;
        var key;
        var obj = json;
        do {
            key = Object.keys(obj)[0];
            levelNow++;
            obj = obj[key];
        } while (key && levelNow < level);
        return key;
    }
    var json = {
        'RuntimeSources': {
            'flask-webapp': {
                'eb-flask1.3': {
                    's3url': ''
                }
            }
        },
        'DeploymentId': 4,
        'Serial': 4
    };
    
    console.log(getFirstKeyInLevel(json, 1)); // RuntimeSources
    console.log(getFirstKeyInLevel(json, 2)); // flask-webapp
    console.log(getFirstKeyInLevel(json, 3)); // eb-flask1.3
    console.log(getFirstKeyInLevel(json, 4)); // s3url
    console.log(getFirstKeyInLevel(json, 5)); // undefined
    

    répondre
    0
  • 漂亮男人

    漂亮男人2017-06-12 09:24:48

    var o = {
      "RuntimeSources": {
        "flask-webapp": {
          "eb-flask1.3": {
            "s3url": ""
          }
        }
      },
      "DeploymentId": 4,
      "Serial": 4
    }

    Ce sont les données qui doivent être traitées. La question du sujet doit être considérée comme un sous-ensemble approprié des questions suivantes
    (Le problème est que tant que "flask-webapp" est obtenu)

    Extraire tous les noms de clés de l'objet et former un tableau

    Ce processus est temporairement appelé 铺平 flat. J'ai également implémenté cette fonction ici pour obtenir cette solution.

    flat(o); 
    // => 
    // ["RuntimeSources", "flask-webapp", "eb-flask1.3", "s3url", "DeploymentId", "Serial"]

    Utilisez Object.keys pour résoudre le problème

    Object.keys Possibilité d'obtenir des noms de clés d'attribut d'objet de premier niveau énumérables

    Utilisez des fonctionnalités comme celle-ci pour écrire des fonctions récursives :

    var flat = o => {
        // 当层键名 
        if (typeof o !== 'object') return []; 
        
        var keys = Object.keys(o); 
        
        return keys.reduce((acc, cur) => {
            return acc.concat( flat(o[cur]) ); 
        }, keys); 
    }

    Capture d'écran

    var log = (item, idx) => {
        console.group(`第 ${idx + 1} 个元素`)
        console.log('值:', item); 
        console.groupEnd(); 
    }
    flat(o).forEach(log); 


    Plus précisément, vous avez besoin flask-webapp de ce nom de clé :

    var res = flat(o).filter(e => e === 'flask-webapp'); 
    console.log(res); 
    // => 
    // ["flask-webapp"] 

    Utilisez JSON.stringify pour résoudre le problème

    JSON.stringify 可以把对象转化成 JSON字符串

    Par exemple, JSON.stringify(o) peut obtenir le résultatJSON.stringify(o) 可以得到结果
    "{"RuntimeSources":{"flask-webapp":{"eb-flask1.3":{"s3url":""}}},"DeploymentId":4,"Serial":4}"

    Continuez à observer et vous trouverez :

    JSON 中, :Celui d'avant

    est le nom clé

    冒号Construisez les éléments JSON dans un tableau, puis sélectionnez ceux avant

    .

    Fonction outil

    // 把在 str 中的 willBeReplaced 替换为 toPlace
    var replaceAll = (str, willBeReplaced, toPlace) => {
        return str.split(willBeReplaced).join(toPlace)
    }
    
    // 把在 str 的全部 willBeCut 替换成 ''
    var cut = (str, willBeCut) => {
        return replaceAll(str, willBeCut, ''); 
    }
    flat

    mise en œuvre

    var flat = o => {
        var str = JSON.stringify(o); 
        
        return ['{', '}', ':', ','].reduce((acc, e) => {
            return replaceAll(acc, e, ` ${e} `); 
        }, str).split(' ').filter(e => e !== "").reduce((acc, cur, idx, its) => {
            if (cur === ':'){
                acc.push(its[idx - 1]); 
            }
            
            return acc;
        }, []).map(e => cut(e, '"', ''));  
    }

    Ce qui précède signifie :

    { } : ,La première réduction ajoute des espaces avant et après

    Code correspondant

    // o 是待处理对象 
    let str = JSON.stringify(o); 
    
    var A = ['{', '}', ':', ','].reduce((acc, e) => {
        // 把 e 的两侧都补上一个空格 
        return replaceAll(acc, e, ` ${e} `); 
    }, str)

    Le résultat est le suivant :

    Streté originale de

    "{"RuntimeSources":{"flask-webapp":{"eb-flask1.3":{"s3url":""}}},"DeploymentId":4,"Serial":4}"

    Après traitement, cela devient

    " { "RuntimeSources" : { "flask-webapp" : { "eb-flask1.3" : { "s3url" : "" } } } , "DeploymentId" : 4 , "Serial" : 4 } "

    AObtenir un résultat intermédiaire

    Suivant

    AÀ traiter ici

    Code correspondant :

    var B = ['{', '}', ':', ','].reduce((acc, e) => {
        return replaceAll(acc, e, ` ${e} `); 
    }, str).split(' ').filter(e => e !== "")
    A 转成中间数组 BConvertir

    en un tableau intermédiaire

     : (de chaîne en tableau)

    La dernière réduction donne le résultatB

    L'observation
    peut mener à une conclusion

    JSON 中, :

    Celui d'avant
    est le nom clé

    冒号

    Rédigez la réduction finale en conséquence : rassemblez les éléments avant
    pour obtenir le résultat

    Capture d'écran

    🎜🎜

    répondre
    0
  • 世界只因有你

    世界只因有你2017-06-12 09:24:48

    var object= {
              "RuntimeSources": {
                "flask-webapp": {
                  "eb-flask1.3": {
                    "s3url": ""
                  }
                }
              },
              "DeploymentId": 4,
              "Serial": 4
            }
        for(i in object){
            console.log(Object.keys(object[i]));
            // console.log(object[i]);//Object {flask-webapp: Object} 执行四次
            for(k in object[i]){
                console.log(Object.keys(object[i][k]));
                // console.log(object[i][k]);//Object {eb-flask1.3: Object}
                for(s in object[i][k]){
                    console.log(Object.keys(object[i][k][s]));
                    //console.log(object[i][k][s])//Object {s3url: ""}
                    for( f in object[i][k][s]){
                        console.log(Object.keys(object[i][k][f]))
                    }
                }
            }
        }
    

    L'erreur "Impossible de convertir un élément indéfini ou nul en objet" doit être générée à la fin de l'exécution. C'est très bien

    .

    répondre
    0
  • PHP中文网

    PHP中文网2017-06-12 09:24:48

    Si vous souhaitez l'implémenter en python, dict est une structure de table de hachage, ce qui signifie qu'une fois les données saisies, elles ont été hachées selon les caractéristiques et ont leur propre ordre
    Si vous pouvez spécifier le nom de la clé. , vous pouvez toujours l'obtenir. Si vous ne pouvez pas le spécifier, vous pouvez toujours l'obtenir. Le nom de la clé, alors cela ne peut pas être fait.

    data = {
      "RuntimeSources": {
        "flask-webapp": {
          "eb-flask1.3": {
            "s3url": ""
          }
        }
      },
      "DeploymentId": 4,
      "Serial": 4
    }
    
    print data['RuntimeSources']['flask-webapp']
    print data['RuntimeSources'].values()[0]

    répondre
    0
  • 世界只因有你

    世界只因有你2017-06-12 09:24:48

    Le dictionnaire par défaut de Python n'est pas ordonné, mais il peut être implémenté à l'aide du dictionnaire ordonné OrderedDict.

    def level_keys(order_dict, level):
        _level = 1
        if level == _level:
            return order_dict.get(order_dict.keys()[0]).keys()
        else:
            return level_keys(order_dict.get(order_dict.keys()[0]), level=level - 1)
    
    
    def main(level=1):
        from collections import OrderedDict
        import json
        dict_str = """{
      "RuntimeSources": {
        "flask-webapp": {
          "eb-flask1.3": {
            "s3url": ""
          }
        }
      },
      "DeploymentId": 4,
      "Serial": 4
    }"""
        order_dict = json.loads(s=dict_str, object_pairs_hook=OrderedDict)
        print(level_keys(order_dict, level))
    
    
    if __name__ == '__main__':
        main(3)
    

    répondre
    0
  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-06-12 09:24:48

    var json = JSON.parse('{  "RuntimeSources": {    "flask-webapp": {      "eb-flask1.3": {        "s3url": ""      }    }  },  "DeploymentId": 4,  "Serial": 4}');
    for (t in json) { console.log(t); }
    
    var test = Object.keys(json);
    console.log(test[0]);

    répondre
    0
  • Annulerrépondre