Python将dict,list,dict结构各层的键值对解压缩为嵌套在JSON对象中的单独JSON数组

时间:2019-03-27 22:06:58

标签: python json

场景:

我需要将python字典结构(在前面的步骤中构造)的列表中的键和值提取到嵌套在JSON对象中的相应“字段”和“值” JSON数组中。

这是我正在生成的复杂JSON字符串的一部分,其中有多个嵌套在迭代器中的for循环迭代器,但是此键值对是棒棒糖的中心位置,也是我卡住的部分,我不知道如何中断将键和值分成相应的数组。以下是我能够返回的部分,但这只是在单个“字段”数组中返回各个字典结构:

root@laravel-dropin:/var/www/html/resources# node js/test.js 
data appended
[Function: writeFile]

我想尽办法尝试打破这一点,下面只是许多失败的尝试之一:

"table": "name", 
"inserts": [
    {
        "fields": [
            {
                "id": 1,
                "name": "National Monument"
            }
        ]
    }
]

产生错误“ IndexError:列表索引超出范围”

这是我需要返回的内容(请忽略任何无效的JSON,而只关注将键值对提炼为单独的JSON数组)。

nameList = [ {'id': 1, 'name': 'National Monument'}, {'id': 1, 'name': "Joe's Bar"} ]

result = []
i = 0
for d in nameList:
    for k, v in d.items():
        result[i]["inserts"].append({"fields":k})
        result[i]["inserts"].append({"values":v})
    i += 1

pprint(result)

3 个答案:

答案 0 :(得分:0)

尝试类似的方法(根据您的原始结构做出决定):

fields = []
values = []

for str in struct_s["inserts"][0]["fields"]:
   for k,v in str.items():
      fields.append(k)
      values.append(v)

struct_n = {"table": "name"}
struct_n["inserts"] = [{"fields":fields,"values":values}]

print (struct_n)

输出

{'table': 'name', 'inserts': [{'fields': ['id', 'name'], 'values': [1, 'National Monument']}]}

答案 1 :(得分:0)

嗨,我不确定您是否正在寻找类似的东西

nameList = [ {'id': 1, 'name': 'National Monument'}, {'id': 1, 'name': 'Joe\'s Bar'} ]
inserts = [None] * len(nameList)
i = 0
for d in nameList:
    inserts[i] = {"fields" : [],"values" : []}
    for k, v in d.items():
        inserts[i]["values"].append(v)
        inserts[i]["fields"].append(k)
    i+=1   

result = {"table": "name"}
result["inserts"] = inserts

print(result)

OutPut

{'table': 'name', 'inserts': [{'fields': ['id', 'name'], 'values':[1, 'National Monument']}, {'fields': ['id', 'name'], 'values': [1, "Joe's Bar"]}]}

答案 2 :(得分:0)

咨询了我组织中比我有更多经验的人,并提出了以下建议:

constJSON = []
i = 0     
for k, v in dictNorm.iteritems():
   constJSON.append({"table":k, "inserts":[]})
   if v:
        for d in v:
            flds = list(d.keys())
            constJSON[i]["inserts"].append({
                         "fields": flds,
                         "values": [d[f] for f in flds]
            })
        i += 1

输出(部分,因为这是一个大字符串,它在表示源数据库表和列或元组的字典结构的多个列表上进行迭代)。

[{'table': 'place_nm', 'inserts': [{'fields': ['id', 'name'], 'values': [1, u'National Monument']}, ...