2016-02-26 22 views
0

我有一个json数组。并且需要使用python打印唯一的id。我该怎么做?如何使用python打印完整的json数组?

这是我的JSON数组:

{ 
"messages": 
    [ 
    { 

    "id": "1531cf7d9e03e527", 
    "threadId": "1531cf7d9e03e527" 
    }, 

    { 
    "id": "1531cdafbcb4a0e6", 
    "threadId": "1531bfccfceb1ed7" 
    } 

], 

"nextPageToken": "01647645424797380808", 

"resultSizeEstimate": 103 
} 

*编辑:*

其实我写的Python代码从Gmail的API消息。 该程序将消息的id和gmail帐户消息的线程标识作为json格式给出。我只需要消息ID而不是线程ID。

from __future__ import print_function 
import httplib2 
import os 

from apiclient import discovery 
import oauth2client 
from oauth2client import client 
from oauth2client import tools 
import json 
try: 
    import argparse 
    flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args() 
    except ImportError: 
    flags = None 


SCOPES = 'https://www.googleapis.com/auth/gmail.readonly' 
CLIENT_SECRET_FILE = 'client_server.json' 
APPLICATION_NAME = 'Gmail API Python Quickstart' 

def get_credentials(): 

    home_dir = os.path.expanduser('~') 
    credential_dir = os.path.join(home_dir, '.credentials') 
    if not os.path.exists(credential_dir): 
     os.makedirs(credential_dir) 
    credential_path = os.path.join(credential_dir, 
            'gmail-python-quickstart.json') 

    store = oauth2client.file.Storage(credential_path) 
    credentials = store.get() 
    if not credentials or credentials.invalid: 
     flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES) 
     flow.user_agent = APPLICATION_NAME 
     if flags: 
      credentials = tools.run_flow(flow, store, flags) 
     else: 
      credentials = tools.run(flow, store) 
     print('Storing credentials to ' + credential_path) 
    return credentials 
def main(): 

    credentials = get_credentials() 
    http = credentials.authorize(httplib2.Http()) 
    service = discovery.build('gmail', 'v1', http=http) 
    message = service.users().messages().get(userId='me',id='').execute() 
    response = service.users().messages().list(userId='me',q='').execute() 
    messages = [] 
    if 'messages' in response: 
     messages.extend(response['messages']) 
     print(messages) 

    result = loads(messages) 
    ids = [message['id'] for message in result['messages']] 
    print (ids) 

    while 'nextPageToken' in response: 
     page_token = response['nextPageToken'] 
     response = service.users().messages().list(userId='me', q='',pageToken=page_token).execute() 
     messages.extend(response['messages']) 
    print(message['id']) 

    print (message['snippet']) 



if __name__ == '__main__': 
    main() 

回答

2
import json 
dict_result = json.loads(your_json) 
ids = [message['id'] for message in dict_result['messages']] 
+0

TypeError:期望的字符串或缓冲区..它给了我raw_decode()错误@andrey – Indhuja

+0

看来你通过python列表而不是JSON字符串(就像你在回答中说的)。 如果是这样,只需跳过json.loads的一部分,并在列表中创建列表迭代器。 'your_parsed_json ['messages']]中的[message ['id']消息'' –

1

因为我没有足够的信誉分置评,我张贴此作为一个答案,否则安德烈Rusanov的答案几乎是正确的。

所以,我复制你张贴的JSON和一个叫messages.json文件保存它

{ "messages": [ 
     {"id": "1531cf7d9e03e527", "threadId": "1531cf7d9e03e527" }, 
     { "id": "1531cdafbcb4a0e6", "threadId": "1531bfccfceb1ed7" } 
    ], 
    "nextPageToken": "01647645424797380808", 
    "resultSizeEstimate": 103 
} 

现在,只打印的ID:

from json import load 
result = load(open("messages.json")) 
ids = [message['id'] for message in result['messages']] 

如果你的json不在文件中并且可作为字符串使用,

from json import loads 
json_string = """ 
{ "messages": [ 
     {"id": "1531cf7d9e03e527", "threadId": "1531cf7d9e03e527" }, 
     { "id": "1531cdafbcb4a0e6", "threadId": "1531bfccfceb1ed7" } 
    ], 
    "nextPageToken": "01647645424797380808", 
    "resultSizeEstimate": 103 
} 
""" 
result = loads(json_string) 
ids = [message['id'] for message in result['messages']] 
+0

'为什么我的答案几乎是正确的?你刚刚添加了一种方法来从文件中加载JSON,这不在答案的范围内,实际上是 –

+0

@AndreyRusanov因为他可能将一个文件传递给loads方法,因此得到他提到的TypeError。另外,他没有提到他是传递一个字符串还是一个文件。这就是为什么我提到你的答案几乎是正确的。 –

+0

@PallabPain NameError:全局名称'loads'未定义是我得到的错误!但我确实有导入json声明! – Indhuja

1
messages=[] 
store=[] 
if 'messages' in response: 
messages.extend(response['messages']) 
for i in range(len(messages)): 
//to store the id alone (Taking the id from the json array) 
store=messages[i]['id'] 
//retrieve messages of this id 
message = service.users().messages().get(userId='me',id=store).execute() 
print(store) 
+0

请在您提出的解决方案中添加一些说明。 – Zulan