Zunächst einmal werde ich frei zugeben, dass ich kaum mehr als ein ungeschickter Typ der freien Künste bin, der in dieser Skriptsache völlig Autodidakt ist. Trotzdem versuche ich, Werte von einem USGS Water Data Service mit dem folgenden Code abzurufen:

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]

Obwohl ich einige Tutorials zum Extrahieren der gewünschten Werte aus einer JSON-Antwort gefunden habe, sind die meisten recht einfach. Die Schwierigkeit, die ich habe, besteht darin, aus einer sehr komplizierten Antwort zu extrahieren, die dieser Dienst zurückgibt. Wenn ich mir die Antwort ansehe, kann ich sehen, was ich möchte, ist der Wert aus zwei verschiedenen Abschnitten und ein Zeitwert. Daher kann ich auf die Antwort schauen und sehen, was ich brauche. Ich kann für mein ganzes Leben einfach nicht herausfinden, wie ich diese Werte extrahieren kann.

31
knu2xs 8 Okt. 2012 im 23:30

3 Antworten

Beste Antwort

Wenn Sie json.loads verwenden, werden Ihre Daten in ein Python-Wörterbuch umgewandelt.

Auf Wörterbuchwerte wird mit ['key'] zugegriffen

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
}

Würde in ein Python-Wörterbuch übersetzen

resp_dict = json.loads(resp_str)

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

resp_dict['value']['queryInfo']['creationTime'] # 1349724919000
52
Eric Palakovich Carr 8 Okt. 2012 im 19:44

Extrahieren Sie einen einzelnen Wert aus der JSON-Antwort Python

Versuche dies

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'])
4
SitiSchu 30 Dez. 2016 im 13:30

Der einzige Vorschlag ist, über .get() auf Ihr resp_dict zuzugreifen, um einen eleganteren Ansatz zu erhalten, der sich gut verschlechtert, wenn die Daten nicht den Erwartungen entsprechen.

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

Sie können auch eine Logik hinzufügen, um den Schlüssel zu testen, wenn Sie dies möchten.

if 'name' in resp_dict:
    resp_dict['name']
else:
    # do something else here.
15
rajan 8 Mai 2018 im 06:57