Python3获取JSON值

Python3获取JSON值,python,json,python-3.x,Python,Json,Python 3.x,我使用rest和python脚本从响应中提取名称和开始时间 我可以获得信息,但我不能合并数据,使信息在CSV中位于同一行。当我将它们导出到CSV时,它们都会出现在新行上 从JSON列表中提取数据可能有更好的方法 for item in driverDetails['Query']['Results']: for data_item in item['XValues']: body.append(data_item) for key, value in da

我使用rest和python脚本从响应中提取名称和开始时间

我可以获得信息,但我不能合并数据,使信息在CSV中位于同一行。当我将它们导出到CSV时,它们都会出现在新行上

从JSON列表中提取数据可能有更好的方法

for item in driverDetails['Query']['Results']:
    for data_item in item['XValues']:
        body.append(data_item)
        for key, value in data_item.items():
            #driver = {}
            #test = {}
            #startTime = {}
            if key == "Name":
                drivers.append(value)
            if key == "StartTime":
                drivers.append(value)

print (drivers)
要写入CSV的代码:

with open(logFileName, 'a') as outcsv:   
# configure writer to write standard csv file
writer = csv.writer(outcsv, delimiter=',', quotechar="'",
                    quoting=csv.QUOTE_MINIMAL, lineterminator='\n',skipinitialspace=True)
for driver in drivers:

    writer.writerow(driver)
以下是回复的示例:

"Query": {
"Results": [
     {
        "XValues": [
            {
                "ReportScopeStartTime": "2018-06-18T23:00:00Z"
            },
            {
                "ReportScopeEndTime": "2018-06-25T22:59:59Z"
            },
            {
                "ID": "1400"
            },
            {
                "Name": " John Doe"
            },
            {
                "StartTime": "2018-06-19T07:16:10Z"
            },
        ],
    },
        "XValues": [
            {
                "ReportScopeStartTime": "2018-06-18T23:00:00Z"
            },
            {
                "ReportScopeEndTime": "2018-06-25T22:59:59Z"
            },
            {
                "ID": "1401"
            },
            {
                "Name": " Jane Smith"
            },
            {
                "StartTime": "2018-06-19T07:16:10Z"
            },
        ],
    },
我的csv输出:

John Doe 
2018-06-19T07:16:10Z
Jane Smith
2018-06-19T07:16:10Z
预期结果:

John Doe, 2018-06-19T07:16:10Z
Jane Smith, 2018-06-19T07:16:10Z

只需使用普通字典访问即可获取值:

for item in driverDetails['Query']['Results']:
    for data_item in item['XValues']:
        body.append(data_item)
        if "Name" in data_item:
             drivers.append(data_item["Name"])
        if "StartTime" in data_item:
             drivers.append(data_item["StartTime"])

print (drivers)
如果您知道这些项已经具有必填字段,那么您甚至不需要在测试中使用

writer.writerow()
需要一个序列。您使用单个字符串作为参数调用它,因此它将字符串拆分为单个字符。您可能希望将名称和开始时间保留在一起,以便将它们提取为元组:

for item in driverDetails['Query']['Results']:
    name, start_time = "", ""
    for data_item in item['XValues']:
        body.append(data_item)
        if "Name" in data_item:
             name = data_item["Name"]
        if "StartTime" in data_item:
             start_time = data_item["StartTime"]

    drivers.append((name, start_time))

print (drivers)
现在不再是字符串列表,
drivers
是元组列表:具有名称和开始时间的每个项目的名称,但如果输入项目具有名称且没有开始时间,则该字段可能为空。编写csv文件的代码现在应该完成预期的任务

如果要获取全部或大部分值,请尝试将它们收集到一个字典中,然后可以拉出所需的字段:

for item in driverDetails['Query']['Results']:
    fields = {}
    for data_item in item['XValues']:
        body.append(data_item)
        fields.update(data_item)

    drivers.append((fields["ID"], fields["Name"], fields["StartTime"]))

print (drivers)
一旦在单个字典中有了字段,您甚至可以使用循环构建元组:

    drivers.append(tuple(fields[f] for f in ("ID", "Name", "StartTime", "ReportScopeStartTime", "ReportScopeEndTime")))

我认为你应该明确列出你想要的字段,以确保新字段不会让你感到惊讶。

嗨,邓肯,谢谢你的回答。当我实现它时,我用来写入CSV文件的代码不断地将每个字符分割成不同的单元格。i、 e J o h n D o e,我已经在上面的问题中添加了我用于文件写入的行,谢谢更新。它现在几乎开始工作了。最后一个小问题是,它似乎无法找到StartTime的值。在输出的详细信息中,它有名称,但StartTime在不应该为空时始终为空。哦,您的数据在单独的对象中有名称和StartTime。我已经更新了代码,所以它现在可以工作了。嗨,邓肯,如果我想带回所有的对象,而不仅仅是名称和开始时间,我是否需要像你给我展示的那样添加它们,还是有更简单的方法?感谢将这些值收集到一个单独的字典中,这样操作起来就更容易了。答案已更新。