javascript - Perihal mendapatkan nama berbilang kunci bersarang dalam berbilang pasangan nilai kunci dalam json
ringa_lee
ringa_lee 2017-06-12 09:22:48
0
6
895
{
  "RuntimeSources": {
    "flask-webapp": {
      "eb-flask1.3": {
        "s3url": ""
      }
    }
  },
  "DeploymentId": 4,
  "Serial": 4
}

Terdapat fail json seperti itu Sekarang saya perlu mengekstrak flask-webapp这个key的name,即flask-webapp rentetan itu sendiri. Menggunakan Object.keys(), saya mendapat tiga kunci RuntimeSource, DeploymentId dan Serial.
Saya rasa penerangan saya agak rumit Untuk meringkaskan masalahnya ialah: cara mengekstrak kunci dalam lapisan nilai kunci seterusnya dalam nilai kunci pertama fail json ini (nampaknya lebih rumit... Saya harap anda dapat memahaminya) )
Ia boleh dilaksanakan menggunakan python atau javascript

ringa_lee
ringa_lee

ringa_lee

membalas semua(6)
黄舟
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
漂亮男人
var o = {
  "RuntimeSources": {
    "flask-webapp": {
      "eb-flask1.3": {
        "s3url": ""
      }
    }
  },
  "DeploymentId": 4,
  "Serial": 4
}

Ini adalah data yang perlu diproses Soalan subjek harus dianggap sebagai subset yang betul dari soalan berikut
(Masalahnya ialah selagi "flask-webapp" diperolehi)

Ekstrak semua nama kunci objek daripada objek dan bentukkan tatasusunan

Proses ini dipanggil sementara 铺平 flat Saya juga telah melaksanakan fungsi ini di sini untuk mendapatkan penyelesaian ini.

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

Gunakan Object.keys untuk menyelesaikan masalah

Object.keys Keupayaan untuk mendapatkan nama kunci atribut objek peringkat pertama yang terbilang

Gunakan ciri seperti ini untuk menulis fungsi rekursif:

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); 
}

ScreenShot

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


Secara khusus anda perlukan flask-webapp nama kunci ini:

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

Gunakan JSON.stringify untuk menyelesaikan masalah

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

Sebagai contoh, JSON.stringify(o) boleh mendapatkan hasilnyaJSON.stringify(o) 可以得到结果
"{"RuntimeSources":{"flask-webapp":{"eb-flask1.3":{"s3url":""}}},"DeploymentId":4,"Serial":4}"

Teruskan pemerhatian dan anda akan dapati:

JSON 中, :Yang sebelum

ialah nama kunci

冒号Bina elemen JSON ke dalam tatasusunan, dan kemudian pilih elemen sebelum

.

Fungsi alat

// 把在 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 pelaksanaan

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, '"', ''));  
}
Di atas bermaksud:

{ } : ,Pengurangan pertama menambah ruang sebelum dan selepas

Kod sepadan

// o 是待处理对象 
let str = JSON.stringify(o); 

var A = ['{', '}', ':', ','].reduce((acc, e) => {
    // 把 e 的两侧都补上一个空格 
    return replaceAll(acc, e, ` ${e} `); 
}, str)
Hasilnya begini:

Str asal dari

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

Selepas diproses, ia menjadi

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

ADapatkan keputusan pertengahan

Seterusnya

AUntuk diuruskan di sini

Kod sepadan:

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

: (dari rentetan ke tatasusunan)

Pengurangan terakhir dapat hasilnyaB

Pemerhatian
boleh membawa kepada kesimpulan

JSON 中, :

Yang sebelum
ialah nama kunci

冒号

Tulis pengurangan akhir dengan sewajarnya: kumpulkan elemen sebelum
untuk mendapatkan hasilnya

ScreenShot

🎜🎜
世界只因有你
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]))
                }
            }
        }
    }

Ralat "Tidak boleh menukar yang tidak ditentukan atau null kepada objek" harus dilemparkan pada penghujung pelaksanaan

Ty80

Jika anda ingin melaksanakannya dalam python, dict adalah struktur jadual hash, yang bermaksud bahawa selepas data dimasukkan, ia telah dicincang mengikut ciri dan mempunyai susunannya sendiri
Jika anda boleh menentukan nama kunci , anda masih boleh mendapatkannya Jika anda tidak dapat menentukannya, anda masih boleh mendapatkannya, maka ia tidak boleh dilakukan

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

print data['RuntimeSources']['flask-webapp']
print data['RuntimeSources'].values()[0]
世界只因有你

Kamus lalai Python tidak tertib, tetapi ia boleh dilaksanakan menggunakan kamus pesanan 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)
曾经蜡笔没有小新
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]);
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan