从Url java读取JSON
我在使用parson从URL获取JSON时遇到问题。下面是代码从Url java读取JSON,java,json,gson,wunderground,Java,Json,Gson,Wunderground,我在使用parson从URL获取JSON时遇到问题。下面是代码 import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import java.util.List; import com.googl
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.List;
import com.google.gson.Gson;
public class Test_Application {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Gson gson = new Gson();
String json = readUrl("http://api.wunderground.com/api/57dd9039b81a9c21/conditions/q/CA/San_Francisco.json");
Page page = gson.fromJson(json, Page.class);
System.out.println(page.description);
System.out.println(page.language);
System.out.println(page.link);
System.out.println(page.title);
}
private static String readUrl(String urlString) throws Exception {
BufferedReader reader = null;
try {
URL url = new URL(urlString);
reader = new BufferedReader(new InputStreamReader(url.openStream()));
StringBuffer buffer = new StringBuffer();
int read;
char[] chars = new char[1024];
while ((read = reader.read(chars)) != -1)
buffer.append(chars, 0, read);
return buffer.toString();
} finally {
if (reader != null)
reader.close();
}
}
static class Page {
String title;
String link;
String description;
String language;
List<Item> items;
}
static class Item {
String title;
String link;
String description;
}
}
我认为问题在于,我有一个不合适的类来读取数据。是这样吗
谢谢
编辑
网站返回以下信息:
{
"response": {
"version": "0.1",
"termsofService": "http://www.wunderground.com/weather/api/d/terms.html",
"features": {
"conditions": 1
}
},
"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": "San Francisco, CA",
"city": "San Francisco",
"state": "CA",
"state_name": "California",
"country": "US",
"country_iso3166": "US",
"zip": "94101",
"latitude": "37.77500916",
"longitude": "-122.41825867",
"elevation": "47.00000000"
},
"observation_location": {
"full": "SOMA - Near Van Ness, San Francisco, California",
"city": "SOMA - Near Van Ness, San Francisco",
"state": "California",
"country": "US",
"country_iso3166": "US",
"latitude": "37.773285",
"longitude": "-122.417725",
"elevation": "49 ft"
},
"estimated": {
},
"station_id": "KCASANFR58",
"observation_time": "Last Updated on February 19, 7:08 AM PST",
"observation_time_rfc822": "Tue, 19 Feb 2013 07:08:18 -0800",
"observation_epoch": "1361286498",
"local_time_rfc822": "Tue, 19 Feb 2013 07:08:31 -0800",
"local_epoch": "1361286511",
"local_tz_short": "PST",
"local_tz_long": "America/Los_Angeles",
"local_tz_offset": "-0800",
"weather": "Mostly Cloudy",
"temperature_string": "47.9 F (8.8 C)",
"temp_f": 47.9,
"temp_c": 8.8,
"relative_humidity": "87%",
"wind_string": "From the SW at 4.0 MPH Gusting to 13.0 MPH",
"wind_dir": "SW",
"wind_degrees": 225,
"wind_mph": 4.0,
"wind_gust_mph": "13.0",
"wind_kph": 6.4,
"wind_gust_kph": "20.9",
"pressure_mb": "1012",
"pressure_in": "29.90",
"pressure_trend": "-",
"dewpoint_string": "44 F (7 C)",
"dewpoint_f": 44,
"dewpoint_c": 7,
"heat_index_string": "NA",
"heat_index_f": "NA",
"heat_index_c": "NA",
"windchill_string": "46 F (8 C)",
"windchill_f": "46",
"windchill_c": "8",
"feelslike_string": "46 F (8 C)",
"feelslike_f": "46",
"feelslike_c": "8",
"visibility_mi": "10.0",
"visibility_km": "16.1",
"solarradiation": "",
"UV": "0",
"precip_1hr_string": "0.00 in ( 0 mm)",
"precip_1hr_in": "0.00",
"precip_1hr_metric": " 0",
"precip_today_string": "0.02 in (1 mm)",
"precip_today_in": "0.02",
"precip_today_metric": "1",
"icon": "mostlycloudy",
"icon_url": "http://icons-ak.wxug.com/i/c/k/mostlycloudy.gif",
"forecast_url": "http://www.wunderground.com/US/CA/San_Francisco.html",
"history_url": "http://www.wunderground.com/weatherstation/WXDailyHistory.asp?ID=KCASANFR58",
"ob_url": "http://www.wunderground.com/cgi-bin/findweather/getForecast?query=37.773285,-122.417725"
}
}
更新代码
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.List;
import com.google.gson.Gson;
public class Test_Application {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Gson gson = new Gson();
String json = readUrl("http://api.wunderground.com/api/57dd9039b81a9c21/conditions/q/CA/San_Francisco.json");
// Page page = gson.fromJson(json, Page.class);
Response response = gson.fromJson(json, Response.class);
System.out.println(response.termsOfService);
System.out.println(response.version);
}
private static String readUrl(String urlString) throws Exception {
BufferedReader reader = null;
try {
URL url = new URL(urlString);
reader = new BufferedReader(new InputStreamReader(url.openStream()));
StringBuffer buffer = new StringBuffer();
int read;
char[] chars = new char[1024];
while ((read = reader.read(chars)) != -1)
buffer.append(chars, 0, read);
return buffer.toString();
} finally {
if (reader != null)
reader.close();
}
}
static class Response{
String version;
String termsOfService;
}
}
您的问题是POJO与JSON不匹配 JSON表示一个对象,您的POJO需要与之匹配。下面是它的一个开始(所有字段都是公共的,没有getter/setter,只是为了简化这个示例):
类MyWUPojo{
公众反应;
//在这之后还有更多与JSON匹配的内容
}
班级反应{
公共字符串版本;
公共字符串服务;
公共地图特征;
}
请注意,一个警告是,如果您只对JSON响应的一部分感兴趣,那么就只需要实现这些。Gson将默默地忽略您没有包含在POJO中的JSON的任何部分 存在GSON的替代方案:
Map< String, Object > decoded =
gson.fromJson(data, new TypeToken< Map< String, Object>>() {}.getType());
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import com.google.gson.Gson;
public class Test_Application
{
public static void main(
String[] args ) throws Exception
{
Gson gson = new Gson();
String json = readUrl(
"http://api.wunderground.com/api/57dd9039b81a9c21/" +
"conditions/q/CA/San_Francisco.json" );
System.out.println( json );
Map< String, Object > decoded =
gson.fromJson(
json,
new TypeToken< Map< String, Object>>() {}.getType());
System.out.println( decoded );
Answer answer = gson.fromJson( json, Answer.class );
System.out.println( answer.response.version );
System.out.println( answer.response.termsofService );
System.out.println( answer.response.features.get( "conditions" ));
System.out.println( answer.current_observation.image );
System.out.println( answer.current_observation.display_location );
}
static class Response
{
String version;
URL termsofService;
Map< String, String > features;
}
static class Observation
{
Map< String, String > image;
Map< String, String > display_location;
// TODO: complete me
}
static class Location
{
// TODO: complete me
}
static class Answer
{
Response response;
Observation current_observation;
Location display_location;
// TODO: complete me
}
@downvoter,我可以有理由改进帖子吗?网站返回了什么?顺便说一句,我没有进行downvoter。问题是您的POJO在任何方面、形状或形式上都与JSON不相似。@bmorris591谢谢:)我已经用响应更新了代码。我已经使用了一个在线JSON查看器来获得响应。一旦我填写了您指定的类,我应该能够正确地访问数据?仅供参考(我只从其他问题中知道这一点)
响应中的功能
实际上可以包含一堆东西,这就是为什么在我的响应中它是一个映射
。我不知道所有的可能性;如果API文档中有所有特性的列表,您还可以充实出一个完整的特性对象。是的,但是如果您只想使用字段,一个通用映射和定制的解析器可能很有用。如果您不想使用POJO,Gson将很乐意充当通用JSON解析器,那么您完全没有理由这么做。在我最初的回答中,这个问题实际上是一个重复的。。。
Map< String, Object > decoded =
gson.fromJson(data, new TypeToken< Map< String, Object>>() {}.getType());
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import com.google.gson.Gson;
public class Test_Application
{
public static void main(
String[] args ) throws Exception
{
Gson gson = new Gson();
String json = readUrl(
"http://api.wunderground.com/api/57dd9039b81a9c21/" +
"conditions/q/CA/San_Francisco.json" );
System.out.println( json );
Map< String, Object > decoded =
gson.fromJson(
json,
new TypeToken< Map< String, Object>>() {}.getType());
System.out.println( decoded );
Answer answer = gson.fromJson( json, Answer.class );
System.out.println( answer.response.version );
System.out.println( answer.response.termsofService );
System.out.println( answer.response.features.get( "conditions" ));
System.out.println( answer.current_observation.image );
System.out.println( answer.current_observation.display_location );
}
static class Response
{
String version;
URL termsofService;
Map< String, String > features;
}
static class Observation
{
Map< String, String > image;
Map< String, String > display_location;
// TODO: complete me
}
static class Location
{
// TODO: complete me
}
static class Answer
{
Response response;
Observation current_observation;
Location display_location;
// TODO: complete me
}
{response={version=0.1, termsofService=http://www.wunderground.com/weather/api/d/terms.html, features={conditions=1.0}}, 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=San Francisco, CA, city=San Francisco, state=CA, state_name=California, country=US, country_iso3166=US, zip=94101, latitude=37.77500916, longitude=-122.41825867, elevation=47.00000000}, observation_location={full=SOMA - Near Van Ness, San Francisco, California, city=SOMA - Near Van Ness, San Francisco, state=California, country=US, country_iso3166=US, latitude=37.773285, longitude=-122.417725, elevation=49 ft}, estimated={}, station_id=KCASANFR58, observation_time=Last Updated on February 19, 8:16 AM PST, observation_time_rfc822=Tue, 19 Feb 2013 08:16:18 -0800, observation_epoch=1361290578, local_time_rfc822=Tue, 19 Feb 2013 08:16:18 -0800, local_epoch=1361290578, local_tz_short=PST, local_tz_long=America/Los_Angeles, local_tz_offset=-0800, weather=Mostly Cloudy, temperature_string=48.7 F (9.3 C), temp_f=48.7, temp_c=9.3, relative_humidity=83%, wind_string=From the ESE at 1.0 MPH, wind_dir=ESE, wind_degrees=109.0, wind_mph=1.0, wind_gust_mph=0.0, wind_kph=1.6, wind_gust_kph=0.0, pressure_mb=1012, pressure_in=29.88, pressure_trend=-, dewpoint_string=44 F (7 C), dewpoint_f=44.0, dewpoint_c=7.0, heat_index_string=NA, heat_index_f=NA, heat_index_c=NA, windchill_string=49 F (9 C), windchill_f=49, windchill_c=9, feelslike_string=49 F (9 C), feelslike_f=49, feelslike_c=9, visibility_mi=10.0, visibility_km=16.1, solarradiation=, UV=0, precip_1hr_string=0.00 in ( 0 mm), precip_1hr_in=0.00, precip_1hr_metric= 0, precip_today_string=0.02 in (1 mm), precip_today_in=0.02, precip_today_metric=1, icon=mostlycloudy, icon_url=http://icons-ak.wxug.com/i/c/k/mostlycloudy.gif, forecast_url=http://www.wunderground.com/US/CA/San_Francisco.html, history_url=http://www.wunderground.com/weatherstation/WXDailyHistory.asp?ID=KCASANFR58, ob_url=http://www.wunderground.com/cgi-bin/findweather/getForecast?query=37.773285,-122.417725}}
0.1
http://www.wunderground.com/weather/api/d/terms.html
1
{url=http://icons-ak.wxug.com/graphics/wu2/logo_130x80.png, title=Weather Underground, link=http://www.wunderground.com}
{full=San Francisco, CA, city=San Francisco, state=CA, state_name=California, country=US, country_iso3166=US, zip=94101, latitude=37.77500916, longitude=-122.41825867, elevation=47.00000000}