无法使用 Jackson 正确处理 Android 中的天气 json
Can't process weather json in Android correctly using Jackson
我在 AsyncTask<Object,Void,GenericResults>
中有这个方法,其中 GenericResults 是 class,我在其中存储来自我的应用程序的一堆不同结果,例如当前位置的纬度、经度和压力.我传递我在 AsyncTask 的参数中创建的 GenericResults 对象,并让它添加上述值,然后 return 修改后的对象(所有这些都在 doInBackground 中)。
我使用的天气 API 是 weatherunderground 的,位于 here。
我遇到的问题是双重的:只是遍历 json,如果我告诉它在 JsonToken.END_OBJECT
处停止,它只会运行到第一个 }
JSON,所以它永远不会到达我想要它停止的地方。最重要的是,如果我在此方法中使用任何 fieldName.equals()
,我会不断收到空指针异常。 pressure_mb
字段内容的正确获取方式是什么?
private void getWebPressure(String longitude, String latitude) {
HttpURLConnection conn;
try {
URL weatherUrl = new URL("http://api.wunderground.com/api/"+API_KEY+"/conditions/q/"+latitude+","+longitude+".json");
conn = (HttpURLConnection) weatherUrl.openConnection();
InputStream in = new BufferedInputStream(conn.getInputStream());
JsonFactory factory = new JsonFactory();
JsonParser parser = factory.createParser(in);
boolean done = false;
while (!done) {
parser.nextToken();
String fieldName = parser.getCurrentName();
parser.nextToken();
Log.v(LOG_TAG, fieldName + " " + parser.getValueAsString());
if (fieldName.equals("pressure_mb")) {
done = true;
result.setPressure(parser.getValueAsString());
}
}
conn.disconnect();
}
catch(IOException e){
Log.e(LOG_TAG,e.toString());
}
}
在尝试执行任何 .equals()
之前,必须稍微切换解析器逻辑并确保该值不为空
while (parser.nextToken() != null && !done) {
parser.nextToken();
String name = parser.getCurrentName();
if (name!=null){
if (name.equals("pressure_mb")) {
parser.nextToken();
String value = parser.getText();
Log.v(LOG_TAG,value);
result.setPressure(value);
break;
}
}
}
我在 AsyncTask<Object,Void,GenericResults>
中有这个方法,其中 GenericResults 是 class,我在其中存储来自我的应用程序的一堆不同结果,例如当前位置的纬度、经度和压力.我传递我在 AsyncTask 的参数中创建的 GenericResults 对象,并让它添加上述值,然后 return 修改后的对象(所有这些都在 doInBackground 中)。
我使用的天气 API 是 weatherunderground 的,位于 here。
我遇到的问题是双重的:只是遍历 json,如果我告诉它在 JsonToken.END_OBJECT
处停止,它只会运行到第一个 }
JSON,所以它永远不会到达我想要它停止的地方。最重要的是,如果我在此方法中使用任何 fieldName.equals()
,我会不断收到空指针异常。 pressure_mb
字段内容的正确获取方式是什么?
private void getWebPressure(String longitude, String latitude) {
HttpURLConnection conn;
try {
URL weatherUrl = new URL("http://api.wunderground.com/api/"+API_KEY+"/conditions/q/"+latitude+","+longitude+".json");
conn = (HttpURLConnection) weatherUrl.openConnection();
InputStream in = new BufferedInputStream(conn.getInputStream());
JsonFactory factory = new JsonFactory();
JsonParser parser = factory.createParser(in);
boolean done = false;
while (!done) {
parser.nextToken();
String fieldName = parser.getCurrentName();
parser.nextToken();
Log.v(LOG_TAG, fieldName + " " + parser.getValueAsString());
if (fieldName.equals("pressure_mb")) {
done = true;
result.setPressure(parser.getValueAsString());
}
}
conn.disconnect();
}
catch(IOException e){
Log.e(LOG_TAG,e.toString());
}
}
在尝试执行任何 .equals()
while (parser.nextToken() != null && !done) {
parser.nextToken();
String name = parser.getCurrentName();
if (name!=null){
if (name.equals("pressure_mb")) {
parser.nextToken();
String value = parser.getText();
Log.v(LOG_TAG,value);
result.setPressure(value);
break;
}
}
}