2016-06-10 18 views
5

sto ottenendo i dati di JIRA utilizzando il seguente codice python,valori Selezione da un file JSON in Python

come faccio a memorizzare la risposta per più di una chiave (il mio esempio mostra solo una chiave, ma, in generale, ottengo molto dei dati) e di stampa solo i valori corrispondenti a total,key, customfield_12830, summary

import requests 
    import json 
    import logging 
    import datetime 
    import base64 
    import urllib 
    serverURL = 'https://jira-stability-tools.company.com/jira' 
    user = 'username' 
    password = 'password' 
    query = 'project = PROJECTNAME AND "Build Info" ~ BUILDNAME AND assignee=ASSIGNEENAME' 
    jql = '/rest/api/2/search?jql=%s' % urllib.quote(query) 
    response = requests.get(serverURL + jql,verify=False,auth=(user, password)) 
    print response.json() 

response.json() USCITA: -

http://pastebin.com/h8R4QMgB

+0

Se la struttura si rifilato qui per mostrare un solo elemento differisce dalla struttura è necessario supportare con più di un elemento, quindi ogni risposta che ti diamo è responsabile di non essere utile nell'altro scenario. –

+0

http://stackoverflow.com/questions/28069753/python-requests-extracting-data-from-response- quetion relativo al testo. controlla anche – WannaBeCoder

+0

BTW, in generale, se hai una struttura profondamente annidata (come questa!) Che vuoi capire, 'pprint' è tuo amico. Vedi https://docs.python.org/2/library/pprint.html –

risposta

1

Dal link incollato a pastebin e dal json che ho visto, è un utente issues come elenco contenente key, fields(which holds custom fields), self, id, expand.

Si può semplicemente ripetere questa risposta ed estrarre i valori per le chiavi che si desidera. Puoi andare come.

data = response.json() 
issues = data.get('issues', list()) 

x = list() 

for issue in issues: 
    temp = { 
     'key': issue['key'], 
     'customfield': issue['fields']['customfield_12830'], 
     'total': issue['fields']['progress']['total'] 
    } 
    x.append(temp) 
print(x) 

x è la lista dei dizionari contenenti i dati per i campi che hai citato. Fammi sapere se non sono stato chiaro da qualche parte o quello che ho dato non è quello che stai cercando.

PS: E 'sempre consigliabile usare dict.get ('keyname', nessuno) per ottenere i valori, come si può sempre mettere un valore predefinito se la chiave non è stata trovata. Per questa soluzione non l'ho fatto perché volevo solo fornire un approccio.

Aggiornamento: Nei commenti si (OP) ha detto che dà attributerror.Try questo codice

data = response.json() 
issues = data.get('issues', list()) 

x = list() 

for issue in issues: 
    temp = dict() 
    key = issue.get('key', None) 
    if key: 
     temp['key'] = key 

    fields = issue.get('fields', None) 
    if fields: 
     customfield = fields.get('customfield_12830', None) 
     temp['customfield'] = customfield 

     progress = fields.get('progress', None) 
     if progress: 
      total = progress.get('total', None) 
      temp['total'] = total 

    x.append(temp) 
print(x) 
+0

questo dà un errore 'AttributeError: 'NoneType' oggetto non ha attributo 'get'' –

+0

sto usando Python 2.7.3, funziona per questa versione, getta come errore come ho detto sopra –

+0

Questo è il motivo per cui ho menzionato che uso , dict.get ('keyname', None) per garantire che la chiave a cui si sta tentando di accedere esista effettivamente.Per te questo errore viene sollevato quando stai provando ad accedere a 'campi' il cui valore è di nuovo dizionario o potrebbe essere 'progresso', che di nuovo è dizionario. Per evitarlo usa fields = issue.get ('fields', None). Quindi se i campi tentano di accedere al tuo campo personalizzato all'interno di esso –