Lesen JSON von Url-java
Ich bin Probleme mit parson die JSON von einer URL. Unten ist der code.
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;
}
}
Ausgabe:
null
null
null
null
Was ich denke, das problem ist, dass ich eine ungeeignete Klasse, um die Daten zu Lesen. Wäre das korrekt?
Dank
BEARBEITEN
Der website gibt das folgende Ergebnis zurück:
{
"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"
}
}
Aktualisierten code
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;
}
}
- kann ich bitte einen Grund haben zu verbessern, die post?
- Was bedeutet die website zurückkehren?
- P. S. ich habe nicht downvote.
- Das problem ist, dass Ihr POJO doen nicht ähneln den JSON, in irgendeiner Weise, form oder form.
- Vielen Dank 🙂 ich habe aktualisiert, der code mit der Antwort. Benutzt habe ich eine online-JSON viewer zu erhalten die Antwort.
- korrekt ist, müssen Sie zum erstellen eines POJO-entspricht der JSON.
- könntest du bitte ein einfaches Beispiel? Ich habe Probleme mit der POJO-Konzept.
- Siehe: stackoverflow.com/questions/14826237/... In der Tat, dies könnte wohl geschlossen werden, wie ein dup.
- this und die this kann hilfreich sein.
- Im wesentlichen, ich habe zu gehen durch die verschiedenen Aspekte des JSON und machen einen relevanten POJO, dass Deserialisieren können?
- Das ist richtig. JSON stellt ein Objekt dar. Ihre Java-Objekt (POJO) übereinstimmen muss, das Objekt. Oder wie ich in der Antwort, die ich auf link zu, Sie können nur analysiert werden, und wählen Sie die Elemente, die Sie wollen und nicht ein POJO.
- Das mit der einen Ausnahme, dass Sie nicht haben, zu erstellen, die das gesamte Objekt im Java-wenn Sie möchten, dass nur bestimmte Teile der JSON. Gson wird stillschweigend ignorieren, die Teil der JSON -, dass Sie nicht in Ihrem POJO (Und vice versa), als Sie entdeckt haben, - das ist, warum alle Ihre Felder sind derzeit null).
- Super!!! Es wäre toll, wenn Sie möchten, fügen Sie diese als Antwort, so kann ich es akzeptieren.
- Fertig 🙂 Vielen Dank.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Alternativen zu GSON vorhanden ist:
Diesem snippet kann helfen, zu tun, eine generic decoder:
Folgende code ist ein Anfang eines bestimmten decoder:
In diesem Zustand der Entwicklung ist, gibt es:
features
imResponse
können tatsächlich eine Menge Dinge, das ist der Grund, warum in meinemResponse
es ist einMap
. Ich weiß nicht, die vollständige Liste von Möglichkeiten; man könnte auch Fleisch komplettFeatures
Objekt, wenn es eine Liste in der API-docs aller von Ihnen.Dein problem ist, dass Ihr POJO nicht mit Ihrem JSON.
JSON stellt ein Objekt dar, und Ihre POJO muss es passen. Hier ist ein Anfang, was das Aussehen würde (alle Felder öffentlichkeit keinen Getter/setter nur um das Beispiel klein):
Beachten Sie, dass die einzige Einschränkung ist, dass, wenn Sie interessiert sind, nur Teil der JSON-Antwort, die Sie umsetzen müssen. Gson wird stillschweigend ignorieren, die Teil der JSON-Sie noch nicht in Ihrem POJO.