代码之家  ›  专栏  ›  技术社区  ›  Juan Jimenez

Python 2.7:json.loads为什么不能正确地将字符串转换成dict?

  •  0
  • Juan Jimenez  · 技术社区  · 8 年前

    我要求ElasticSearch数据库使用Python 2.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"}]
    
    1 回复  |  直到 8 年前
        1
  •  2
  •   MisterMiyagi    8 年前

    您的错误是试图转换 口述清单 听写:

    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 ? 为什么只有一个条目?

    这个 迪克特 了解三种初始化方法:关键字、映射和iterables。一个 列表 适合最后一个。

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

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

    注意每个元素是如何通过迭代来解包的?在回复中,每个元素都是 迪克特 具有 二 条目。在此基础上迭代得到两个 钥匙 但忽略了这些值。

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

    致 迪克特 构造函数,则应答中的每个元素都具有相同的键值对: "index" 和 "creation.date.string" . 由于dict中的键是唯一的,因此所有元素都折叠到同一个条目中: {"index": "creation.date.string"} .