Python中的动态JSON

Python中的动态JSON,python,json,Python,Json,我需要动态构建以下JSON结构 json = { "mainkey":"val1", "key2":[ {"keya":"val1rec1","keyb":"val2rec1","keyc":"val3rec1"}, {"keya":"val1rec2","keyb":"val2rec2","keyc":"val3rec2"}, {"keya":"val1rec3","keyb":"val2rec3","keyc":"val3rec3"}, {"keya"

我需要动态构建以下JSON结构

json = {
    "mainkey":"val1",
    "key2":[
   {"keya":"val1rec1","keyb":"val2rec1","keyc":"val3rec1"},
   {"keya":"val1rec2","keyb":"val2rec2","keyc":"val3rec2"},
   {"keya":"val1rec3","keyb":"val2rec3","keyc":"val3rec3"},
   {"keya":"val1rec4","keyb":"val2rec4","keyc":"val3rec4"},
   {"keya":"val1rec5","keyb":"val2rec5","keyc":"val3rec5"}
            ]
       }
只有“{”keya:“val1rec1”,“keyb:“val2rec1”,“keyc:“val3rec1”}”,行“迭代”-即从CSV文件读取值,然后根据CSV文件中的内容填充/创建行

我的伪代码如下所示:

#create dict
path = 'somewhere\on\my\disk\file.csv'
json_file = {}
json_file['mainkey'] = "val1" 
#read from CSV file
df1 = pd.read_csv(path, header=None)
    #iterate through csv
for row,s in df1.iterrows():
    number = df1.loc[row,0]
    #I'm reading keyb and keyc values from CSV as well, but for brevity my substitution below is not showing that.... 
    json_file['key2'] = "'keya':'"+str(number)+"','keyb':'whatever','keyc':'whatever'"
print (json_file)

显然,它无法生成我在上面寻找的内容-因此,我在这里发表文章寻求帮助。

您正在覆盖
key2
值,而您应该将它们附加到列表中:

json_file['key2'] = []
for row,s in df1.iterrows():
    number = df1.loc[row,0]
    json_file['key2'].append({'keya': str(number), 'keyb': 'whatever', 'keyc': 'whatever'})
print (json_file)

看起来您正在尝试手动构造json编码器,这是不必要的,因为有一个很好的解决方案

我建议您使用本机数据结构构建dict,并使用内置json实用程序。这将产生更干净、更易于维护的代码,并且不容易出错

像这样:

import json
# ... Other imports you may have such as pandas


path = "somewhere\on\my\disk\file.csv"
# Initialize dict
data = {"mainkey": "val1", "key2": list()}

# Parse CSV file
df1 = pd.read_csv(path, header=None)
# iterate through csv
for row,s in df1.iterrows():
    number = df1.loc[row,0]

    # I'm reading keyb and keyc values from CSV as well, 
    # but for brevity my substitution below is not showing that.... 
    data['key2'].append({
        "keya":number,
        "keyb":"whatever",
        "keyc":"whatever",
    })

# Print json to stdout/terminal
json_data = json.dumps(data)
print(json.dumps(data, sort_keys=True))

# Save json to file (data.json)
with open("data.json", "w") as output:
    json.dump(data, output, sort_keys=True)

你能提供你正在使用的csv文件吗?至少有一个示例。在进一步查看代码后,您似乎尝试为key2手动构建json对象结构,但在此之前使用适当的dict结构。请参阅my以了解更多详细信息。谢谢,我想我理解您的建议-但是,当我这样做时,json的顺序不正确-将“mainkey”打印为文件中的最后一个键?这不重要,因为hashmaps/Dict是无序的。然而,在Python 3.6中,dict是默认排序的。好吧,我为您做了更多的挖掘工作,如果您希望排序,可以将sorted_keys=True传递给json.dump。如果使用Python3.6/3.7就足够了,如果您使用的是和更早的版本,则必须使用OrderedICT。您还可以使用indent=X控制缩进。请参阅我更新的答案,了解排序实现。如果这对您不起作用,请提供您正在使用的python版本,否则我将无法进一步帮助您。谢谢。还发现顺序无关紧要,因此您的解决方案工作正常。