Python2.7:为什么json.loads文件无法正确地将字符串转换为dict?

2024-05-16 12:18:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我要求一个ElasticSearch数据库使用python2.7和Requests包为我提供索引列表及其创建日期。这样做的目的是快速计算哪些索引超出了保留策略,需要休眠。你知道吗

请求非常有效,结果正是我想要的。但是,当我运行下面的代码时,当我尝试将json结果转换为dict时,dict的类型是正确的,但它报告的大小是1,此时应该至少有几十个条目。我做错什么了?我有一种感觉,这是一件非常愚蠢的事情,但我就是做不到!:)

import json
import requests

esEndPoint = "https://localhost:9200"
retrieveString = "/_cat/indices?h=index,creation.date.string&format=json&s=creation.date"

# Gets the current indices and their creation dates

def retrieveIndicesAndDates():
    try:
        theResult = requests.get(esEndPoint+retrieveString)
        print (theResult.content)
    except Exception as e:
        print("Unable to retrieve list of indices with creation dates.")
        print("Error: "+e)
        exit(3)
    return theResult.content

def main():
    theDict = dict(json.loads(retrieveIndicesAndDates()))
    print(type(theDict)) # Reports correct type
    print(len(theDict))  # Always outputs "1" ??
    for index, creationdate in theDict.items():
        print("Index: ",index,", Creation date: ",theDict[index])
    return

调用返回的json:

[{"index":".kibana","creation.date.string":"2017-09-14T15:01:38.611Z"},{"index":"logstash-2018.07.23","creation.date.string":"2018-07-23T00:00:01.024Z"},{"index":"cwl-2018.07.23","creation.date.string":"2018-07-23T00:00:03.877Z"},{"index":"k8s-testing-internet-2018.07.23","creation.date.string":"2018-07-23T14:19:10.024Z"},{"index":"logstash-2018.07.24","creation.date.string":"2018-07-24T00:00:01.023Z"},{"index":"k8s-testing-internet-2018.07.24","creation.date.string":"2018-07-24T00:00:01.275Z"},{"index":"cwl-2018.07.24","creation.date.string":"2018-07-24T00:00:02.157Z"},{"index":"k8s-testing-internet-2018.07.25","creation.date.string":"2018-07-25T00:00:01.022Z"},{"index":"logstash-2018.07.25","creation.date.string":"2018-07-25T00:00:01.186Z"},{"index":"cwl-2018.07.25","creation.date.string":"2018-07-25T00:00:04.012Z"},{"index":"logstash-2018.07.26","creation.date.string":"2018-07-26T00:00:01.026Z"},{"index":"k8s-testing-internet-2018.07.26","creation.date.string":"2018-07-26T00:00:01.185Z"},{"index":"cwl-2018.07.26","creation.date.string":"2018-07-26T00:00:02.587Z"},{"index":"k8s-testing-internet-2018.07.27","creation.date.string":"2018-07-27T00:00:01.027Z"},{"index":"logstash-2018.07.27","creation.date.string":"2018-07-27T00:00:01.144Z"},{"index":"cwl-2018.07.27","creation.date.string":"2018-07-27T00:00:04.485Z"},{"index":"ctl-2018.07.27","creation.date.string":"2018-07-27T09:02:09.854Z"},{"index":"cfl-2018.07.27","creation.date.string":"2018-07-27T11:12:44.681Z"},{"index":"elb-2018.07.27","creation.date.string":"2018-07-27T11:13:51.340Z"},{"index":"cfl-2018.07.24","creation.date.string":"2018-07-27T11:45:23.697Z"},{"index":"cfl-2018.07.23","creation.date.string":"2018-07-27T11:45:24.646Z"},{"index":"cfl-2018.07.25","creation.date.string":"2018-07-27T11:45:25.700Z"},{"index":"cfl-2018.07.26","creation.date.string":"2018-07-27T11:45:26.341Z"},{"index":"elb-2018.07.24","creation.date.string":"2018-07-27T11:45:27.440Z"},{"index":"elb-2018.07.25","creation.date.string":"2018-07-27T11:45:29.572Z"},{"index":"elb-2018.07.26","creation.date.string":"2018-07-27T11:45:36.170Z"},{"index":"logstash-2018.07.28","creation.date.string":"2018-07-28T00:00:01.023Z"},{"index":"k8s-testing-internet-2018.07.28","creation.date.string":"2018-07-28T00:00:01.316Z"},{"index":"cwl-2018.07.28","creation.date.string":"2018-07-28T00:00:03.945Z"},{"index":"elb-2018.07.28","creation.date.string":"2018-07-28T00:00:53.992Z"},{"index":"ctl-2018.07.28","creation.date.string":"2018-07-28T00:07:19.543Z"},{"index":"k8s-testing-internet-2018.07.29","creation.date.string":"2018-07-29T00:00:01.026Z"},{"index":"logstash-2018.07.29","creation.date.string":"2018-07-29T00:00:01.378Z"},{"index":"cwl-2018.07.29","creation.date.string":"2018-07-29T00:00:04.100Z"},{"index":"elb-2018.07.29","creation.date.string":"2018-07-29T00:00:59.241Z"},{"index":"ctl-2018.07.29","creation.date.string":"2018-07-29T00:06:44.199Z"},{"index":"logstash-2018.07.30","creation.date.string":"2018-07-30T00:00:01.024Z"},{"index":"k8s-testing-internet-2018.07.30","creation.date.string":"2018-07-30T00:00:01.179Z"},{"index":"cwl-2018.07.30","creation.date.string":"2018-07-30T00:00:04.417Z"},{"index":"elb-2018.07.30","creation.date.string":"2018-07-30T00:01:01.442Z"},{"index":"ctl-2018.07.30","creation.date.string":"2018-07-30T00:08:28.936Z"},{"index":"cfl-2018.07.30","creation.date.string":"2018-07-30T06:52:16.739Z"}]

Tags: jsondatestringindextestinginternetctlcreation
1条回答
网友
1楼 · 发布于 2024-05-16 12:18:48

您的错误是试图将目录列表转换为目录:

theDict = dict(json.loads(retrieveIndicesAndDates()))
#         ^^^^^                                     ^

这只适用于一个目录。不过,这是多余的。你知道吗

直接用回信就行了。每个条目都是带有相应键的dict:

data = json.loads(retrieveIndicesAndDates())
for entry in data:
    print("Index: ", entry["index"], ", Creation date: ", entry["creation.date.string"])

那么当你把list转换成dict时会发生什么呢?为什么只有一个条目?你知道吗

dict理解三种初始化方法:关键字、映射和iterables。一个list适合最后一个。你知道吗

iterable的初始化会经过它,并期望键值iterable作为元素。如果要手动执行,则如下所示:

def sequence2dict(sequence):
    map = {}
    for element in sequence:
        key, value = element
        map[key] = value
    return map

注意每个元素是如何通过迭代解包的吗?在应答中,每个元素都是一个dict,有两个条目。迭代产生两个,但忽略值。你知道吗

key, value = {"index":".kibana","creation.date.string":"2017-09-14T15:01:38.611Z"}
print(key, '=>', value)  # prints "index => creation.date.string"

对于dict构造函数,应答中的每个元素都有相同的键值对:"index""creation.date.string"。因为dict中的键是唯一的,所以所有元素都折叠到同一个条目:{"index": "creation.date.string"}。你知道吗

相关问题 更多 >