2012-10-08 3 views
12

Tout d'abord, je vais concéder librement d'être un peu plus d'un gars des arts libéraux maladroit qui est complètement autodidacte dans cette chose de script. Cela dit, je tente d'obtenir des valeurs d'un service de données USGS eau à l'aide du code ci-dessous:Extrait la valeur unique de la réponse JSON Python

def main(gaugeId): 

    # import modules 
    import urllib2, json 

    # create string 
    url = "http://waterservices.usgs.gov/nwis/iv/?format=json&sites=" + gaugeId + "&parameterCd=00060,00065" 

    # open connection to url 
    urlFile = urllib2.urlopen(url) 

    # load into local JSON list 
    jsonList = json.load(urlFile) 

    # extract and return 
    # how to get cfs, ft, and zulu time? 
    return [cfs, ft, time] 

Bien que j'ai trouvé quelques tutoriels sur la façon d'extraire les valeurs souhaitées à partir d'une réponse JSON, la plupart sont assez simples . La difficulté que j'ai est d'extraire de ce qui ressemble à une réponse très compliquée ce service est de retour. En regardant à travers la réponse, je peux voir ce que je veux est la valeur de deux sections différentes et une valeur de temps. Par conséquent, je peux regarder la réponse et voir ce dont j'ai besoin, je ne peux tout simplement pas, pour la vie de moi, comprendre comment extraire ces valeurs.

Nous vous remercions de votre aide pour trouver une solution!

+7

Pouvez-vous donner un échantillon de JSON et quelle valeur vous avez besoin? Ou une valeur pour 'gaugeId' que nous pouvons utiliser. –

+0

Quelqu'un a demandé à voir la réponse JSON. Je m'excuse de ne pas l'avoir inclus orginally. Plutôt que d'afficher le tout (il est plutôt grand), il suffit de suivre ce lien: http://waterservices.usgs.gov/nwis/iv/?format=json&sites=01646500¶meterCd=00060,00065. D'après ce que je peux dire, je cherche value> timeSeries> variable> value> value – knu2xs

Répondre

25

en utilisant json.loads va transformer vos données en python dictionary.

valeurs dictionnaires sont accessibles à l'aide ['key']

resp_str = { 
    "name" : "ns1:timeSeriesResponseType", 
    "declaredType" : "org.cuahsi.waterml.TimeSeriesResponseType", 
    "scope" : "javax.xml.bind.JAXBElement$GlobalScope", 
    "value" : { 
    "queryInfo" : { 
     "creationTime" : 1349724919000, 
     "queryURL" : "http://waterservices.usgs.gov/nwis/iv/", 
     "criteria" : { 
     "locationParam" : "[ALL:103232434]", 
     "variableParam" : "[00060, 00065]" 
     }, 
     "note" : [ { 
     "value" : "[ALL:103232434]", 
     "title" : "filter:sites" 
     }, { 
     "value" : "[mode=LATEST, modifiedSince=null]", 
     "title" : "filter:timeRange" 
     }, { 
     "value" : "sdas01", 
     "title" : "server" 
     } ] 
    } 
    }, 
    "nil" : false, 
    "globalScope" : true, 
    "typeSubstituted" : false 
} 

se traduirait par une diction python

resp_dict = json.loads(resp_str) 

resp_dict['name'] # "ns1:timeSeriesResponseType" 

resp_dict['value']['queryInfo']['creationTime'] # 1349724919000 
4

seule suggestion est d'accéder à votre resp_dict via .get() pour une approche plus gracieuse qui se dégradera bien si les données ne sont pas comme prévu.

resp_dict = json.loads(resp_str) 
resp_dict.get('name') # will return None if 'name' doesn't exist 

Vous pouvez également ajouter une logique pour tester la clé si vous le souhaitez également.

if 'name' in resp_dict: 
    resp.dict['name'] 
else: 
    # do something else here. 
1

Extrait valeur unique de JSON réponse Python

Essayez cette

import json 
import sys 

#load the data into an element 
data={"test1" : "1", "test2" : "2", "test3" : "3"} 

#dumps the json object into an element 
json_str = json.dumps(data) 

#load the json to a string 
resp = json.loads(json_str) 

#print the resp 
print (resp) 

#extract an element in the response 
print (resp['test1'])