如何从JSON回复中有意义地提取信息? [英] How to meaningfully extract information from a JSON reply?

查看:126
本文介绍了如何从JSON回复中有意义地提取信息?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

{   "response": {       "version": "0.1"        
"termsofService": "http://www.wunderground.com/weather/api/d/terms.html"        
"features": {       "geolookup": 1      
        "conditions": 1     
        "forecast": 1       }   }       
    "location": {       "type":"INTLCITY"
        "country":"IN"
        "country_iso3166":"IN"
        "country_name":"India"
        "state":""
        "city":"Mumbai"
        "tz_short":"IST"
        "tz_long":"Asia/Kolkata"
        "lat":"19.12000084"
        "lon":"72.84999847"
        "zip":"00000"
        "magic":"1"
        "wmo":"43003"
        "l":"/q/zmw:00000.1.43003"
        "requesturl":"global/stations/43003.html"
        "wuiurl":"http://www.wunderground.com/global/stations/43003.html"
        "nearby_weather_stations": {        "airport": {        "station": [        { "city":"Mumbai / Santacruz"
 "state":""
 "country":"India"
 "icao":"VABB"
 "lat":"19.11666679"
 "lon":"72.84999847" }
        { "city":"Mumbai"
 "state":""
 "country":"IN"
 "icao":"VABB"
 "lat":"19.12000084"
 "lon":"72.84999847" }      ]       }       
        "pws": {        "station": [        ]       }       }   }       
    "current_observation": {        "image": {      "url":"http://icons-ak.wxug.com/graphics/wu2/logo_130x80.png"
        "title":"Weather Underground"
        "link":"http://www.wunderground.com"        }
        "display_location": {       "full":"Mumbai
 India"
        "city":"Mumbai"
        "state":""
        "state_name":"India"
        "country":"IN"
        "country_iso3166":"IN"
        "zip":"00000"
        "latitude":"19.12000084"
        "longitude":"72.84999847"
        "elevation":"14.00000000"       }
        "observation_location": {       "full":"Mumbai
 "
        "city":"Mumbai"
        "state":""
        "country":"IN"
        "country_iso3166":"IN"
        "latitude":"19.12000084"
        "longitude":"72.84999847"
        "elevation":"46 ft"     }
        "estimated": {      }
        "station_id":"VABB"
        "observation_time":"Last Updated on February 16
 5:10 PM IST"
        "observation_time_rfc822":"Sat
 16 Feb 2013 17:10:00 +0530"
        "observation_epoch":"1361014800"
        "local_time_rfc822":"Sat
 16 Feb 2013 17:25:20 +0530"
        "local_epoch":"1361015720"
        "local_tz_short":"IST"
        "local_tz_long":"Asia/Kolkata"
        "local_tz_offset":"+0530"
        "weather":"Clear"
        "temperature_string":"77 F (25 C)"
        "temp_f":77
        "temp_c":25
        "relative_humidity":"54%"
        "wind_string":"From the WNW at 8 MPH"
        "wind_dir":"WNW"
        "wind_degrees":290
        "wind_mph":8
        "wind_gust_mph":0
        "wind_kph":13
        "wind_gust_kph":0
        "pressure_mb":"1008"
        "pressure_in":"29.77"
        "pressure_trend":"0"
        "dewpoint_string":"59 F (15 C)"
        "dewpoint_f":59
        "dewpoint_c":15
        "heat_index_string":"NA"
        "heat_index_f":"NA"
        "heat_index_c":"NA"
        "windchill_string":"NA"
        "windchill_f":"NA"
        "windchill_c":"NA"
        "feelslike_string":"77 F (25 C)"
        "feelslike_f":"77"
        "feelslike_c":"25"
        "visibility_mi":"3.7"
        "visibility_km":"6.0"
        "solarradiation":""
        "UV":"-1"
        "precip_1hr_string":"-9999.00 in (-9999.00 mm)"
        "precip_1hr_in":"-9999.00"
        "precip_1hr_metric":"-9999.00"
        "precip_today_string":"0.00 in (0.0 mm)"
        "precip_today_in":"0.00"
        "precip_today_metric":"0.0"
        "icon":"clear"
        "icon_url":"http://icons-ak.wxug.com/i/c/k/clear.gif"
        "forecast_url":"http://www.wunderground.com/global/stations/43003.html"
        "history_url":"http://www.wunderground.com/history/airport/VABB/2013/2/16/DailyHistory.html"
        "ob_url":"http://www.wunderground.com/cgi-bin/findweather/getForecast?query=19.12000084
72.84999847"    }       
    "forecast":{        "txt_forecast": {       "date":"5:30 AM IST"
        "forecastday": [        {       "period":0
        "icon":"chancerain"
        "icon_url":"http://icons-ak.wxug.com/i/c/k/chancerain.gif"
        "title":"Saturday"
        "fcttext":"Partly cloudy with a chance of rain in the morning
 then clear. High of 81F. Winds from the WNW at 10 to 15 mph. Chance of rain 30%."
        "fcttext_metric":"Partly cloudy with a chance of rain in the morning
 then clear. High of 27C. Breezy. Winds from the WNW at 15 to 25 km/h. Chance of rain 30%."
        "pop":"30"      }       
        {       "period":1
        "icon":"clear"
        "icon_url":"http://icons-ak.wxug.com/i/c/k/clear.gif"
        "title":"Saturday Night"
        "fcttext":"Clear. Low of 68F. Winds less than 5 mph."
        "fcttext_metric":"Clear. Low of 20C. Winds less than 5 km/h."
        "pop":"0"       }       
        {       "period":2
        "icon":"clear"
        "icon_url":"http://icons-ak.wxug.com/i/c/k/clear.gif"
        "title":"Sunday"
        "fcttext":"Clear. High of 82F. Winds from the NE at 5 to 15 mph shifting to the WNW in the afternoon."
        "fcttext_metric":"Clear. High of 28C. Winds from the NE at 5 to 20 km/h shifting to the WNW in the afternoon."
        "pop":"0"       }       
        {       "period":3
        "icon":"clear"
        "icon_url":"http://icons-ak.wxug.com/i/c/k/clear.gif"
        "title":"Sunday Night"
        "fcttext":"Clear. Low of 66F. Winds from the NNE at 5 to 10 mph."
        "fcttext_metric":"Clear. Low of 19C. Winds from the NNE at 10 to 15 km/h."
        "pop":"0"       }       
        {       "period":4
        "icon":"clear"
        "icon_url":"http://icons-ak.wxug.com/i/c/k/clear.gif"
        "title":"Monday"
        "fcttext":"Clear. High of 88F. Winds from the NNE at 5 to 15 mph shifting to the NW in the afternoon."
        "fcttext_metric":"Clear. High of 31C. Breezy. Winds from the NNE at 10 to 20 km/h shifting to the NW in the afternoon."
        "pop":"0"       }       
        {       "period":5
        "icon":"clear"
        "icon_url":"http://icons-ak.wxug.com/i/c/k/clear.gif"
        "title":"Monday Night"
        "fcttext":"Clear. Low of 63F. Winds from the NNE at 5 to 10 mph."
        "fcttext_metric":"Clear. Low of 17C. Winds from the NNE at 5 to 15 km/h."
        "pop":"0"       }       
        {       "period":6
        "icon":"clear"
        "icon_url":"http://icons-ak.wxug.com/i/c/k/clear.gif"
        "title":"Tuesday"
        "fcttext":"Clear. High of 90F. Winds from the North at 5 to 10 mph shifting to the WNW in the afternoon."
        "fcttext_metric":"Clear. High of 32C. Winds from the North at 5 to 20 km/h shifting to the WNW in the afternoon."
        "pop":"0"       }       
        {       "period":7
        "icon":"clear"
        "icon_url":"http://icons-ak.wxug.com/i/c/k/clear.gif"
        "title":"Tuesday Night"
        "fcttext":"Clear. Low of 72F. Winds from the North at 5 to 10 mph."
        "fcttext_metric":"Clear. Low of 22C. Winds from the North at 5 to 15 km/h."
        "pop":"0"       }       ]       }
        "simpleforecast": {     "forecastday": [        {"date":{   "epoch":"1361037600"
    "pretty":"11:30 PM IST on February 16
 2013"
    "day":16
    "month":2
    "year":2013
    "yday":46
    "hour":23
    "min":"30"
    "sec":0
    "isdst":"0"
    "monthname":"February"
    "weekday_short":"Sat"
    "weekday":"Saturday"
    "ampm":"PM"
    "tz_short":"IST"
    "tz_long":"Asia/Kolkata"}
        "period":1
        "high": {       "fahrenheit":"81"
        "celsius":"27"      }
        "low": {        "fahrenheit":"68"
        "celsius":"20"      }
        "conditions":"Chance of Rain"
        "icon":"chancerain"
        "icon_url":"http://icons-ak.wxug.com/i/c/k/chancerain.gif"
        "skyicon":"mostlysunny"
        "pop":30
        "qpf_allday": {     "in": 0.01
        "mm": 0.3       }
        "qpf_day": {        "in": 0.00
        "mm": 0.0       }
        "qpf_night": {      "in": 0.00
        "mm": 0.0       }
        "snow_allday": {        "in": 0
        "cm": 0     }
        "snow_day": {       "in": 0
        "cm": 0     }
        "snow_night": {     "in": 0
        "cm": 0     }
        "maxwind": {        "mph": 14
        "kph": 22
        "dir": "WNW"
        "degrees": 294      }
        "avewind": {        "mph": 12
        "kph": 19
        "dir": "WNW"
        "degrees": 295      }
        "avehumidity": 53
        "maxhumidity": 72
        "minhumidity": 49       }       
        {"date":{   "epoch":"1361124000"
    "pretty":"11:30 PM IST on February 17
 2013"
    "day":17
    "month":2
    "year":2013
    "yday":47
    "hour":23
    "min":"30"
    "sec":0
    "isdst":"0"
    "monthname":"February"
    "weekday_short":"Sun"
    "weekday":"Sunday"
    "ampm":"PM"
    "tz_short":"IST"
    "tz_long":"Asia/Kolkata"}
        "period":2
        "high": {       "fahrenheit":"82"
        "celsius":"28"      }
        "low": {        "fahrenheit":"66"
        "celsius":"19"      }
        "conditions":"Clear"
        "icon":"clear"
        "icon_url":"http://icons-ak.wxug.com/i/c/k/clear.gif"
        "skyicon":"sunny"
        "pop":0
        "qpf_allday": {     "in": 0.00
        "mm": 0.0       }
        "qpf_day": {        "in": 0.00
        "mm": 0.0       }
        "qpf_night": {      "in": 0.00
        "mm": 0.0       }
        "snow_allday": {        "in": 0
        "cm": 0     }
        "snow_day": {       "in": 0
        "cm": 0     }
        "snow_night": {     "in": 0
        "cm": 0     }
        "maxwind": {        "mph": 11
        "kph": 18
        "dir": "NW"
        "degrees": 306      }
        "avewind": {        "mph": 8
        "kph": 13
        "dir": "WSW"
        "degrees": 238      }
        "avehumidity": 55
        "maxhumidity": 64
        "minhumidity": 39       }       
        {"date":{   "epoch":"1361210400"
    "pretty":"11:30 PM IST on February 18
 2013"
    "day":18
    "month":2
    "year":2013
    "yday":48
    "hour":23
    "min":"30"
    "sec":0
    "isdst":"0"
    "monthname":"February"
    "weekday_short":"Mon"
    "weekday":"Monday"
    "ampm":"PM"
    "tz_short":"IST"
    "tz_long":"Asia/Kolkata"}
        "period":3
        "high": {       "fahrenheit":"88"
        "celsius":"31"      }
        "low": {        "fahrenheit":"63"
        "celsius":"17"      }
        "conditions":"Clear"
        "icon":"clear"
        "icon_url":"http://icons-ak.wxug.com/i/c/k/clear.gif"
        "skyicon":"sunny"
        "pop":0
        "qpf_allday": {     "in": 0.00
        "mm": 0.0       }
        "qpf_day": {        "in": 0.00
        "mm": 0.0       }
        "qpf_night": {      "in": 0.00
        "mm": 0.0       }
        "snow_allday": {        "in": 0
        "cm": 0     }
        "snow_day": {       "in": 0
        "cm": 0     }
        "snow_night": {     "in": 0
        "cm": 0     }
        "maxwind": {        "mph": 12
        "kph": 19
        "dir": "NW"
        "degrees": 310      }
        "avewind": {        "mph": 9
        "kph": 14
        "dir": "SW"
        "degrees": 235      }
        "avehumidity": 44
        "maxhumidity": 62
        "minhumidity": 30       }       
        {"date":{   "epoch":"1361296800"
    "pretty":"11:30 PM IST on February 19
 2013"
    "day":19
    "month":2
    "year":2013
    "yday":49
    "hour":23
    "min":"30"
    "sec":0
    "isdst":"0"
    "monthname":"February"
    "weekday_short":"Tue"
    "weekday":"Tuesday"
    "ampm":"PM"
    "tz_short":"IST"
    "tz_long":"Asia/Kolkata"}
        "period":4
        "high": {       "fahrenheit":"90"
        "celsius":"32"      }
        "low": {        "fahrenheit":"72"
        "celsius":"22"      }
        "conditions":"Clear"
        "icon":"clear"
        "icon_url":"http://icons-ak.wxug.com/i/c/k/clear.gif"
        "skyicon":"sunny"
        "pop":0
        "qpf_allday": {     "in": 0.00
        "mm": 0.0       }
        "qpf_day": {        "in": 0.00
        "mm": 0.0       }
        "qpf_night": {      "in": 0.00
        "mm": 0.0       }
        "snow_allday": {        "in": 0
        "cm": 0     }
        "snow_day": {       "in": 0
        "cm": 0     }
        "snow_night": {     "in": 0
        "cm": 0     }
        "maxwind": {        "mph": 10
        "kph": 16
        "dir": "WNW"
        "degrees": 302      }
        "avewind": {        "mph": 8
        "kph": 13
        "dir": "West"
        "degrees": 272      }
        "avehumidity": 46
        "maxhumidity": 51
        "minhumidity": 30       }       ]       }   }}
---------------------------
        mph: 8,  

答复澳大利亚悉尼

{   "response": {       "version": "0.1"        
"termsofService": "http://www.wunderground.com/weather/api/d/terms.html"        
"features": {       "geolookup": 1      
        "conditions": 1     
        "forecast": 1       }   }       
    "location": {       "type":"INTLCITY"
        "country":"AU"
        "country_iso3166":"AU"
        "country_name":"Australia"
        "state":"NW"
        "city":"Sydney"
        "tz_short":"EST"
        "tz_long":"Australia/Sydney"
        "lat":"-33.95000076"
        "lon":"151.17999268"
        "zip":"00000"
        "magic":"1"
        "wmo":"94767"
        "l":"/q/zmw:00000.1.94767"
        "requesturl":"global/stations/94767.html"
        "wuiurl":"http://www.wunderground.com/global/stations/94767.html"
        "nearby_weather_stations": {        "airport": {        "station": [        { "city":"Sydney Airport"
 "state":""
 "country":"Australia"
 "icao":"YSSY"
 "lat":"-33.95000076"
 "lon":"151.18333435" }
        { "city":"Sydney"
 "state":""
 "country":"AU"
 "icao":"YSSY"
 "lat":"-33.95000076"
 "lon":"151.17999268" }
        { "city":"Richmond (NSW)"
 "state":""
 "country":"AU"
 "icao":"YSRI"
 "lat":"-33.59999847"
 "lon":"150.77999878" }     ]       }       
        "pws": {        "station": [        {       "neighborhood":"Matraville"
        "city":"Sydney"
        "state":"NSW"
        "country":"AUSTRALIA"
        "id":"INSWMATR2"
        "lat":-33.957550
        "lon":151.230850
        "distance_km":4
        "distance_mi":2     }
        {       "neighborhood":"Bardwell Park"
        "city":"Sydney"
        "state":"New South Wales"
        "country":"AUSTRALIA"
        "id":"INEWSOUT37"
        "lat":-33.938381
        "lon":151.124359
        "distance_km":5
        "distance_mi":3     }
        {       "neighborhood":"APRSWXNET Sydney AU"
        "city":"Little Bay"
        "state":"NW"
        "country":"AU"
        "id":"MD5399"
        "lat":-33.958500
        "lon":151.240677
        "distance_km":5
        "distance_mi":3     }
        {       "neighborhood":""
        "city":"Pyrmont"
        "state":"NEW SOUTH WALES"
        "country":"AUSTRALIA"
        "id":"INEWSOUT155"
        "lat":-33.871807
        "lon":151.194977
        "distance_km":8
        "distance_mi":5     }
        {       "neighborhood":"Woolloomooloo"
        "city":"Woolloomooloo"
        "state":"NSW"
        "country":"AUSTRALIA"
        "id":"INSWWOOL3"
        "lat":-33.874527
        "lon":151.220734
        "distance_km":9
        "distance_mi":5     }
        {       "neighborhood":"Old\u0027s Park"
        "city":"Penshurst"
        "state":"NSW"
        "country":"AUSTRALIA"
        "id":"INSWPENS2"
        "lat":-33.958290
        "lon":-208.924866
        "distance_km":9
        "distance_mi":5     }
        {       "neighborhood":"Searl Road"
        "city":"Cronulla"
        "state":"NSW"
        "country":"AUSTRALIA"
        "id":"INSWCRON2"
        "lat":-34.052074
        "lon":151.148605
        "distance_km":11
        "distance_mi":7     }
        {       "neighborhood":"Cronulla - Cecil Apartments"
        "city":"Cronulla - Sydney"
        "state":"NSW"
        "country":"AUSTRALIA"
        "id":"INSWSYDN19"
        "lat":-34.054329
        "lon":151.153656
        "distance_km":11
        "distance_mi":7     }
        {       "neighborhood":"The Shire - Caringbah South"
        "city":"Sydney"
        "state":"New South Wales"
        "country":"Australia"
        "id":"INSWCARI2"
        "lat":-34.048203
        "lon":151.120697
        "distance_km":12
        "distance_mi":7     }
        {       "neighborhood":"Kareela"
        "city":"Kareela"
        "state":"NSW"
        "country":"AUSTRALIA"
        "id":"INSWKIRR2"
        "lat":-34.020538
        "lon":151.075287
        "distance_km":12
        "distance_mi":7     }
        {       "neighborhood":"Caringbah South"
        "city":"Caringbah South"
        "state":"NSW"
        "country":"AUSTRALIA"
        "id":"INSWCARI3"
        "lat":-34.054550
        "lon":151.115799
        "distance_km":13
        "distance_mi":7     }
        {       "neighborhood":"Sutherland Shire"
        "city":"Caringbah South"
        "state":"NEW SOUTH WALES"
        "country":"Australia"
        "id":"INEWSOUT125"
        "lat":-34.059315
        "lon":151.117416
        "distance_km":13
        "distance_mi":8     }
        {       "neighborhood":"Lower North Shore"
        "city":"Linley Point (Lane Cove)"
        "state":"NEW SOUTH WALES"
        "country":"AUSTRALIA"
        "id":"INEWSOUT83"
        "lat":-33.826977
        "lon":151.151077
        "distance_km":13
        "distance_mi":8     }
        {       "neighborhood":"Gymea Bay South of Sydney near Royal National Park"
        "city":"Sydney"
        "state":"NSW"
        "country":"Australia"
        "id":"ISYDNEY2"
        "lat":-34.047691
        "lon":151.079971
        "distance_km":14
        "distance_mi":8     }
        {       "neighborhood":"Willoughby"  
[some more text here]
    ---------------------------
            mph: 7,  


问题

这是来自Weather Underground的两个不同城市的回复.在孟买的情况下,它仅提供有关一个城市的数据,而在悉尼的情况下,它提供有关悉尼周围许多位置的数据.


Problem

This is the reply from Weather Underground for two different cities. In case of Mumbai, it just gives data about one city however in case of Sydney, it gives the data about many locations around Sydney.

我希望能够以一致的方式从此JSON答复中提取信息.到目前为止,我使用String方法进行了一些不太可靠的提取.
我该怎么做呢?

I want to be able to extract information from this JSON reply in a consistent manner. So far, I use String methods for some not-so-reliable extraction.
How do I go about doing that ?

package test;

import java.net.*;
import java.io.*;

import org.apache.commons.lang3.text.WordUtils;

import com.google.gson.*;
import com.google.gson.stream.JsonReader;


public class TestGson {

    URL callToApi;
//------------------------------------------------------------------------------
    public static void main(String[] args) {
        new TestGson();
    }
//------------------------------------------------------------------------------
    public TestGson(){
        try{
            sendCallToApi();
            readJson();
        }catch(IOException e){
            e.printStackTrace();
        }
    }
//------------------------------------------------------------------------------
    public void sendCallToApi(){
        try{
            callToApi = new URL("http://api.wunderground.com/api" +
                    "/[API KEY HERE]" +
                    "/geolookup/conditions/forecast/q/" +
                    "Australia/" +
                    "Sydney.json");
        }catch(MalformedURLException e){
            e.printStackTrace();
        }
    }
//------------------------------------------------------------------------------
    public void readJson() throws IOException{
        Gson g = new Gson();
        String wdf = null;
        InputStreamReader in = new InputStreamReader(callToApi.openStream());
        BufferedReader reader = new BufferedReader(in);
        String message = "hello";
        StringBuffer buf = new StringBuffer();

        while(true){
            message = reader.readLine();

            if(message == null){
                break;
            }else{
                if(message.contains("mph")){
                    wdf = message;
                }
                buf.append(message);
            }
        }
        message = buf.toString();
        System.out.println(message.replaceAll(",","\n"));
        System.out.println("---------------------------");
        wdf = wdf.replace("\"", "");
        System.out.println(wdf);
    }
//------------------------------------------------------------------------------
}

推荐答案

JSON是序列化的对象-这意味着它非常适合反序列化.这使您可以将JSON转换为可以随意查询的Java对象.
首先,您需要一个合适的Java bean-JSON的结构很简单,因此不难.
然后,您可以使用诸如 Jackson 之类的工具读取数据并将其放入bean.

JSON is a serialized object - this means it is very amenable to deserialization. This allows you to turn your JSON into a java object that you can query at will.
First you would need an appropriate java bean - the structure of your JSON is simple so that shouldn't be hard.
You can then use a tool such as Jackson to read your data and put it onto the bean.

这篇关于如何从JSON回复中有意义地提取信息?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆