Trước khi đọc: Tôi đã sử dụng thư viện GSON có thể tải xuống trong chương trình này. http://webscripts.softpedia.com/script/Development-Scripts-js/Other-Libraries/Gson-71373.htmlPhân tích chuỗi JSON từ URL (RESTful webservice) bằng cách sử dụng thư viện GSON. Android
Tôi đã cố gắng phân tích cú pháp JSON trong một thời gian ngắn nhưng mỗi lần tôi cố gắng lấy chuỗi từ URL chương trình không "hoạt động". Nó không thất bại hoặc đóng cửa hoặc nhận được lỗi. Nó không làm phân tích cú pháp. Chương trình của tôi có nghĩa là phân tích cú pháp từ http://api.geonames.org/weatherIcaoJSON?ICAO=LSZH&username=demo và có nút để cập nhật chạy quá trình phân tích cú pháp một lần nữa để nó sẽ làm mới thông tin. Nếu tôi sử dụng chuỗi JSON được mã hóa cứng, chương trình sẽ hoạt động hoàn hảo. Tôi thậm chí đặt trong chuỗi đó là vụ phải được lấy từ URL; nhưng tôi dường như không thể lấy nó trực tiếp. Tôi đang sử dụng thư viện GSON.
Trong mã, tôi đã cung cấp các nhận xét để giải thích quy trình suy nghĩ của tôi. Lưu ý rằng tôi có 2 phương pháp khác nhau đang cố gắng sử dụng URL (tôi nghĩ rằng có lẽ bản gốc là sai vì vậy tôi đã cố gắng sử dụng một cái khác), đây là tôi nắm lấy ống hút. Hãy giúp tôi ra. Cảm ơn bạn.
Mã của tôi:.
package com.android.testgson;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URI;
import java.net.URL;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.google.gson.Gson;
public class GSONTestActivity extends Activity {
/** Called when the activity is first created. */
//String test = "";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView tv = (TextView)findViewById(R.id.textViewInfo);
syncButtonClickListener();
runJSONParser(tv);
}
private void syncButtonClickListener()
{
Button syncButton = (Button)findViewById(R.id.buttonSync);
syncButton.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
TextView tv = (TextView)findViewById(R.id.textViewInfo);
runJSONParser(tv);
}
});
}
public InputStream getJSONData(String url){
// create DefaultHttpClient
HttpClient httpClient = new DefaultHttpClient();
URI uri; // for URL
InputStream data = null; // for URL's JSON
try {
uri = new URI(url);
HttpGet method = new HttpGet(uri); // Get URI
HttpResponse response = httpClient.execute(method); // Get response from method.
data = response.getEntity().getContent(); // Data = Content from the response URL.
} catch (Exception e) {
e.printStackTrace();
}
return data;
}
public void runJSONParser(TextView tv){
try{
Gson gson = new Gson();
//Reader r = new InputStreamReader(getJSONData("http://api.geonames.org/weatherIcaoJSON?ICAO=LSZH&username=demo"));
/**I tried parsing the URL, but it didn't work. No error messages, just didn't parse.*/
//Reader r = new InputStreamReader(getJSONData("android.resource://"+ getPackageName() + "/" + R.raw.yourparsable));
/**I tried parsing from local JSON file. Didn't work. Again no errors. The program simply stalls. */
//String testString = "{\"weatherObservation\":{\"clouds\":\"few clouds\",\"weatherCondition\":\"n/a\",\"observation\":\"LSZH 041320Z 24008KT 210V270 9999 FEW022 SCT030 BKN045 05/01 Q1024 NOSIG\",\"windDirection\":\"240\",\"ICAO\":\"LSZH\",\"elevation\":\"432\",\"countryCode\":\"CH\",\"lng\":\"8.516666666666667\",\"temperature\":\"5\",\"dewPoint\":\"1\",\"windSpeed\":\"08\",\"humidity\":\"75\",\"stationName\":\"Zurich-Kloten\",\"datetime\":\"2012-01-04 13:20:00\",\"lat\":\"47.46666666666667\",\"hectoPascAltimeter\":\"1024\"}}";
/**If I parse this string. The parser works. It is the same exact string like in the URL.*/
//String failString = "{\"status\":{\"message\":\"the hourly limit of 2000 credits demo has been exceeded. Please throttle your requests or use the commercial service.\",\"value\":19}}";
/**Even if the url delivers this string (because the hourly limit would be reached), the string is still parsed correctly.*/
String json = readUrl("http://api.geonames.org/weatherIcaoJSON?ICAO=LSZH&username=demo");
/**At this point I tried a different means of accessing the URL but still I had the exact same problem*/
Observation obs = gson.fromJson(json, Observation.class);
// "json" can be replaced with r, testString, failString to see all my previous results.
if (obs.getWeatherObservation()!=null)
{
tv.setText("Clouds - " + obs.getWeatherObservation().getClouds()
+ "\nTemperature - " + obs.getWeatherObservation().getTemperature()
+ "\nWind Speed - " + obs.getWeatherObservation().getWindSpeed()
+ "\nHumidity - " + obs.getWeatherObservation().getHumidity());
}
else if (obs.getStatus()!=null)
{
tv.setText("Message - " + obs.getStatus().getMessage()
+ "\nValue - " + obs.getStatus().getValue());
}
}catch(Exception ex){
ex.printStackTrace();
}
}
public 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();
}
}
}
Bạn có thể đăng 'của bạn Observation.java'? – curioustechizen
Bạn đã xác minh rằng 'readURL' là không trả về chuỗi bạn mong đợi? –