2016-05-03 5 views
4

Ich habe eine Menge Forschung auf dieser Website gemacht, also vergib mir, wenn ich nicht die richtige Antwort vor der Veröffentlichung gefunden habe. Ich versuche speziell, Daten von der Wettergound-API zu sammeln, um eine Wettervorhersage für 7-10 Tage auf unserer ColdFusion-Website anzuzeigen. Ich habe kein Problem damit, Ergebnisse aus JSON herauszuziehen, die sich NICHT in einem JSON-Array befinden.Wie Ergebnisse aus einem JSON-Array und INTO ColdFusion für eine 7-Tage-Wettervorhersage gezogen werden

Hier ist die spezifische Arbeits Code ist ich einzelne Tage Wetter Ergebnisse Anzeige erhalten bin mit:

<cfhttp url="http://api.wunderground.com/api/02e63b13f45e6430/forecast/geolookup/conditions/q/CA/San_Francisco.json"> 
<cfset parsed_json = deserializeJSON(cfhttp.fileContent)> 
<cfset location = parsed_json.location.city> 
<cfset weather = parsed_json.current_observation.weather> 
<cfset temp_f = parsed_json.current_observation.temp_f> 

<cfoutput> 
<div class="weather-info"> 
<span class="current-conditions">Current Conditions</span> 
<span class="weather-location">#location#</span> 
<center>#weather#</center> 
<span class="weather-temp-f">#temp_f# <sup>&deg;</sup></span> 
</cfoutput> 

Während der obige Code funktioniert, bin ich nicht klar, wie die 7-10 Tage Wetter ziehen Vorhersage aus dem JSON-Array heraus und bringt es in ColdFusion. Nach Tagen der Forschung konnte ich keine Antwort finden. Ich habe mein ColdFusion-Buch noch einmal gelesen und auch die Antwort nicht gefunden. Die Wetterkanäle unterstützen und Dokumentation ist sehr schlecht, so dass sie nicht sehr hilfreich waren. Hier ist die JSON Datei/array:

http://api.wunderground.com/api/02e63b13f45e6430/forecast/geolookup/conditions/q/CA/San_Francisco.json

Hier ist ein Link zu einer teilweisen Screenshot des Arrays: http://suiteamerica.com/images/JSON_array.jpg

Hier ist ein Teil des Codes der JSON-Datei, die das Array forecastday

"forecast":{ 
     "txt_forecast": { 
     "date":"10:01 AM PDT", 
     "forecastday": [ 
     { 
     "period":0, 
     "icon":"cloudy", 
     "icon_url":"http://icons.wxug.com/i/c/k/cloudy.gif", 
     "title":"Tuesday", 
     "fcttext":"Cloudy. Slight chance of a rain shower. High 64F. Winds W at 10 to 15 mph.", 
     "fcttext_metric":"Cloudy skies. Slight chance of a rain shower. High 18C. Winds W at 15 to 25 km/h.", 
     "pop":"20" 
     } 
     , 
     { 
     "period":1, 
     "icon":"nt_cloudy", 
     "icon_url":"http://icons.wxug.com/i/c/k/nt_cloudy.gif", 
     "title":"Tuesday Night", 
     "fcttext":"Cloudy. Slight chance of a rain shower. Low 52F. Winds SW at 10 to 15 mph.", 
     "fcttext_metric":"Cloudy. Slight chance of a rain shower. Low 11C. Winds WSW at 15 to 25 km/h.", 
     "pop":"20" 
     } 
     , 
     { 
     "period":2, 
     "icon":"mostlycloudy", 
     "icon_url":"http://icons.wxug.com/i/c/k/mostlycloudy.gif", 
     "title":"Wednesday", 
     "fcttext":"Mostly cloudy skies. High 63F. Winds SW at 10 to 20 mph.", 
     "fcttext_metric":"Mostly cloudy. High 17C. Winds SW at 15 to 30 km/h.", 
     "pop":"20" 
     } 
     , 
     { 
     "period":3, 
     "icon":"nt_mostlycloudy", 
     "icon_url":"http://icons.wxug.com/i/c/k/nt_mostlycloudy.gif", 
     "title":"Wednesday Night", 
     "fcttext":"Partly cloudy during the evening followed by cloudy skies overnight. Slight chance of a rain shower. Low 53F. Winds SW at 10 to 20 mph.", 
     "fcttext_metric":"Partly cloudy skies during the evening will give way to cloudy skies overnight. Slight chance of a rain shower. Low 11C. Winds SW at 15 to 30 km/h.", 
     "pop":"20" 
     } 
     , 
     { 
     "period":4, 
     "icon":"partlycloudy", 
     "icon_url":"http://icons.wxug.com/i/c/k/partlycloudy.gif", 
     "title":"Thursday", 
     "fcttext":"Cloudy skies early, followed by partial clearing. High 64F. Winds WSW at 10 to 20 mph.", 
     "fcttext_metric":"Cloudy early with partial sunshine expected late. High 17C. Winds WSW at 15 to 30 km/h.", 
     "pop":"20" 
     } 
     , 
     { 
     "period":5, 
     "icon":"nt_chancerain", 
     "icon_url":"http://icons.wxug.com/i/c/k/nt_chancerain.gif", 
     "title":"Thursday Night", 
     "fcttext":"Partly cloudy skies early followed by mostly cloudy skies and a few showers later at night. Low 52F. Winds WSW at 10 to 15 mph. Chance of rain 30%.", 
     "fcttext_metric":"Partly cloudy during the evening. A few showers developing later during the night. Low 11C. Winds WSW at 15 to 30 km/h. Chance of rain 30%.", 
     "pop":"30" 
     } 
     , 
     { 
     "period":6, 
     "icon":"chancerain", 
     "icon_url":"http://icons.wxug.com/i/c/k/chancerain.gif", 
     "title":"Friday", 
     "fcttext":"Rain showers in the morning becoming more intermittent in the afternoon. High 63F. Winds SW at 10 to 15 mph. Chance of rain 50%.", 
     "fcttext_metric":"Showers early becoming less numerous later in the day. High 17C. Winds SW at 15 to 25 km/h. Chance of rain 50%.", 
     "pop":"50" 
     } 
     , 
     { 
     "period":7, 
     "icon":"nt_mostlycloudy", 
     "icon_url":"http://icons.wxug.com/i/c/k/nt_mostlycloudy.gif", 
     "title":"Friday Night", 
     "fcttext":"Partly cloudy skies during the evening will give way to cloudy skies overnight. Low 54F. Winds SSW at 5 to 10 mph.", 
     "fcttext_metric":"Partly cloudy during the evening followed by cloudy skies overnight. Low 12C. Winds SSW at 10 to 15 km/h.", 
     "pop":"20" 
     } 
     ] 
     }, 

das einzige, was das Wetter Kanäle Wunderground Unterstützung mir gesagt hat war, dass forecastday t Das Array, aus dem ich die Daten extrahieren muss.

Ich war auch in der Lage, die DATE-Daten zu erhalten, das ist direkt vor den forecastday Array angeordnet anzuzeigen:

<cfset fctdate = parsed_json.forecast.txt_forecast.date> 

Dies ist, wo ich weiß nicht wirklich den besten Weg, die 7-10 zu erhalten Tagesprognosedaten aus dem JSON-Array.

Müsste ich ein einzelnes Ergebnis aus dem JSON-Array auswählen und es innerhalb des CFSET-Tags definieren, z. B. Forecastday Periode [0] usw.? Oder müsste ich ein CFLOOP-Tag verwenden, um die Ergebnisse einzutragen? Und wenn ja, wie würde ich den CFLOOP schreiben, um die 7-10 Tage Wettervorhersage zu ergattern?

Jede Hilfe wäre willkommen. Ich denke, ich habe alle notwendigen Unterlagen zur Verfügung gestellt, um zu helfen, dies zu lösen. Lassen Sie es mich wissen, wenn eine weitere Klärung erforderlich ist oder wenn ich es versäumt habe, die erforderlichen Unterlagen zur Verfügung zu stellen. Danke an alle, die helfen.

Antwort

1

Ich bin nicht vertraut mit der API, also begann ich mit dem Deserialisieren der Daten und die Suche nach Mustern. Der Speicherauszug enthüllte, dass der JSON zwei Vorhersagearrays enthält: txt_forecast und simpleForecast. Beide enthalten tägliche Prognosen für die nächsten fünf (5) Tage in Kalenderreihenfolge.

txt_forecast.forecastDay enthält zwei Prognosen pro Tag: eine für Morgen und Abend.
txt_forecast.forecastDay dump

simpleForecast.forecastDay enthält eine einzelne Prognose pro Tag, mit speziellen Details wie hohe und niedrige Temperaturen.

simpleForecast.forecastDay dump

Da die Arrayelemente sind in Kalender Reihenfolge, einfach eine Schleife durch die Array-Elemente. Zum Beispiel mit simpleForecast:

<cfset nextFiveDays = parsed_json.forecast.simpleForecast.forecastDay> 
<cfoutput> 
<cfloop array="#nextFiveDays#" index="forecast"> 
    <!--- Display day of week/date ---> 
    #forecast.date.weekday#/#forecast.date.monthName# #forecast.date.day#, #forecast.date.year# <br> 
    <!--- Display conditions ---> 
    Conditions: #forecast.conditions#<br> 
    Hi: #forecast.high.fahrenheit# F<br> 
    Low: #forecast.low.fahrenheit# F<br> 
    <img src="#forecast.icon_url#"><hr> 
</cfloop> 
</cfoutput> 

Ergebnisse:

Simple Forecast Next 5 Days

Verwendung der gleichen Art von Array-Schleife mit txt_forecast. Schließen Sie einfach den entsprechenden Schlüsselnamen:

<cfset nextFiveDays = parsed_json.forecast.txt_forecast.forecastDay> 
<cfoutput> 
<cfloop array="#nextFiveDays#" index="forecast"> 
    <!--- day of week ---> 
    #forecast.title# <br> 
    Forecast: #forecast.fcttext# 
    ... other values here ... 
</cfloop> 
</cfoutput> 

Truncated txt_forecast results

Offensichtlich, dass nicht das ganze Bild ist, aber Sie sollten einen guten Ausgangspunkt geben.

+1

Heiliger Mist, der funktioniert !!! Sie sollten wahrscheinlich für die IT-Abteilung des Wetterkanals arbeiten, da Sie eine bessere Antwort geben als ihre bezahlten Mitarbeiter. Deine brilliante !!! :) – Reuni0n

+1

(Bearbeiten) Haha, froh, dass es geholfen hat. Nichts schlimmer als schlechte Dokumentation. Vielleicht werde ich Visitenkarten drucken lassen: * "... hilft Ordnung in das Chaos zu bringen, eine schlecht dokumentierte API auf einmal!" – Leigh