Using Python and elasticsearch, how can I loop through the returned JSON object?
Question: My code is as follows:

    
    
    import json
    from elasticsearch import Elasticsearch
    
    es = Elasticsearch()
    
    resp = es.search(index="mynewcontacts", body={"query": {"match_all": {}}})
        response = json.dumps(resp)
        data = json.loads(response)
        #print data["hits"]["hits"][0]["_source"]["email"]
        for row in data:
        print row["hits"]["hits"][0]["_source"]["email"]
        return "OK"
    

which produces this truncated (for convenience) JSON:

    
    
    {"timed_out": false, "took": 1, "_shards": {"successful": 5, "total": 5, "failed": 0}, "hits": {"max_score": 1.0, "total": 7, "hits": [{"_index": "mynewcontacts", "_type": "contact", "_score": 1.0, 
    "_source": {"email": "sharon.zhuo@xxxxx.com.cn", "position": "Sr.Researcher", "last": "Zhuo", "first": "Sharon", "company": "Tabridge Executive Search"}, "_id": "AVYmLMlKJVSAh7zyC0xf"},
    {"_index": "mynewcontacts", "_type": "contact", "_score": 1.0, "_source": {"email": "andrew.springthorpe@xxxxx.gr.jp", "position": "Vice President", "last": "Springthorpe", "first": "Andrew", "company": "SBC Group"}, "_id": "AVYmLMlRJVSAh7zyC0xg"}, {"_index": "mynewcontacts", "_type": "contact", "_score": 1.0, "_source": {"email": "mjbxxx@xxx.com", "position": "Financial Advisor", "last": "Bell", "first": "Margaret Jacqueline", "company": "Streamline"}, "_id": "AVYmLMlXJVSAh7zyC0xh"}, {"_index": "mynewcontacts", "_type": "contact", "_score": 1.0, "_source": {"email": "kokaixxx@xxxx.com", "position": "Technical Solutions Manager MMS North Asia", "last": "Okai", "first": "Kensuke", "company": "Criteo"}, "_id": "AVYmLMlfJVSAh7zyC0xi"}, {"_index": "mynewcontacts", "_type": "contact", "_score": 1.0, "_source": {"email": "mizuxxxxto@zszs.com", "position": "Sr. Strategic Account Executive", "last": "Kato", "first": "Mizuto", "company": "Twitter"}, "_id": "AVYmLMlkJVSAh7zyC0xj"}, {"_index": "mynewcontacts", "_type": "contact", "_score": 1.0, "_source": {"email": "abc@example.com", "position": "Design Manager", "last": "Okada", "first": "Kengo", "company": "ON Semiconductor"}, "_id": "AVYmLMlpJVSAh7zyC0xk"}, {"_index": "mynewcontacts", "_type": "contact", "_score": 1.0, "_source": {"email": "007@example.com", "position": "Legal Counsel", "last": "Lei", "first": "Yangzi (Karen)", "company": "Samsung China Semiconductor"}, "_id": "AVYmLMkUJVSAh7zyC0xe"}]}}
    

When I try:

    
    
    print data["hits"]["hits"][0]["_source"]["email"]
    

it prints the first email fine but when I attempt the loop with

    
    
    for row in data:
        print row["hits"]["hits"][0]["_source"]["email"]
    

I receive an error:

    
    
    TypeError: string indices must be integers
    

Please can somebody suggest how I can iterate through the items correctly?
Many thanks!


Answer: What you're doing is looping through keys of the dictionary. To print each
email in the response you'd do this:

    
    
    for row in data["hits"]["hits"]:
        print row["_source"]["email"]
    

Also converting to json isn't necessary. This should accomplish what you're
looking to do:

    
    
    from elasticsearch import Elasticsearch
    
    es = Elasticsearch()
    
    resp = es.search(index="mynewcontacts", body={"query": {"match_all": {}}})
    for row in resp["hits"]["hits"]:
        print row["_source"]["email"]
    return "OK"
    

