2016-06-10 18 views
5

jestem coraz danych JIRA za pomocą następującego kodu Pythona,wybranie wartości z pliku JSON w Pythonie

jak mogę zapisać odpowiedź dla więcej niż jednego klucza (mój przykład pokazuje tylko jeden klucz, ale w ogóle mam dużo danych) i wydrukować tylko wartości odpowiadającej 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() wyjściowych: -

http://pastebin.com/h8R4QMgB

+0

Jeśli struktura ty przycięte tutaj, aby wyświetlić tylko jeden element różni się od struktury potrzebne do wsparcia z więcej niż jednej pozycji, wtedy każda odpowiedź, którą ci udzielimy, może nie być przydatna w innym scenariuszu. –

+0

http://stackoverflow.com/questions/28069753/python-requests-extracting-data-from-response- queting związany z tekstem. sprawdź też. – WannaBeCoder

+0

Przy okazji BTW, jeśli masz strukturę głęboko zagnieżdżoną (taką jak ta!), Którą chcesz wymyślić, 'pprint' jest twoim przyjacielem. Zobacz https://docs.python.org/2/library/pprint.html –

Odpowiedz

1

Od linku wklejonego do pastebin i od json, który widziałem, jest to issues jako lista zawierająca key, fields(which holds custom fields), self, id, expand.

Można po prostu powtórzyć tę odpowiedź i wyodrębnić wartości dla wybranych kluczy. Możesz iść.

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 jest lista słowników zawierających dane dla pól, które wymienione. Daj mi znać, jeśli gdzieś byłam niejasna lub to, co dałem, nie jest tym, czego szukasz.

PS: To jest zawsze wskazane, aby używać dict.get („nazwą klucza”, None) uzyskać wartości jak zawsze można umieścić wartość domyślną, jeśli klucz nie zostanie znaleziony. Dla tego rozwiązania nie zrobiłem tego, ponieważ chciałem tylko zapewnić podejście.

Aktualizacja: W komentarzach (PO) wspomniano, że daje attributerror.Try ten kod

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

to daje błąd "AttributeError:" Obiekt NoneType 'nie ma atrybutu' get'' –

+0

Korzystam z Pythona 2.7.3, czy działa on dla tej wersji, to wyrzuca jako błąd jak napisałem powyżej –

+0

To jest powód, dla którego wspomniałem o tym zastosowaniu , dict.get ('keyname', None), aby upewnić się, że klucz, do którego próbujesz uzyskać dostęp, rzeczywiście istnieje.Dla ciebie ten błąd powstaje, gdy próbujesz uzyskać dostęp do "pól", których wartością jest znowu słownik lub może to być "postęp", który znowu jest słownikiem. Aby tego uniknąć użyj field = issue.get ("fields", None). Następnie, jeśli pola próbują uzyskać dostęp do niestandardowego pola wewnątrz niego, to: –