检索地震 JSON 结果时出现问题?
Posted
技术标签:
【中文标题】检索地震 JSON 结果时出现问题?【英文标题】:Problem retrieving the earthquake JSON results? 【发布时间】:2017-02-03 12:57:15 【问题描述】:您好!在我删除硬编码的JSON
数据并移至从 URL 请求数据之后。我遇到异常错误。代码与最终的官方 git 几乎相同,但我得到了错误。
我从JSON
中提取数据的代码是:
private static final String USGS_REQUEST_URL =
"http://earthquake.usgs.gov/fdsnws/event/1/query?format=geojson&orderby=time&minmag=5&limit=10";
//
public static List<Earthquake> extractFeaturesfromJson(String earthquakeJSON)
/*if the json is null then return earlu*/
if (TextUtils.isEmpty(earthquakeJSON))
return null;
// Create an empty ArrayList that we can start adding earthquakes to
List<Earthquake> earthquakes = new ArrayList<>();
// Try to parse the JsonResponseString. If there's a problem with the way the JSON
// is formatted, a JSONException exception object will be thrown.
// Catch the exception so the app doesn't crash, and print the error message to the logs.
try
// create an object form jsonString
JSONObject root = new JSONObject(earthquakeJSON);
JSONArray features = root.getJSONArray("features");
for (int i = 0; i < features.length(); i++)
// Get a single earthquake at position i within the list of earthquakes
JSONObject currentEarthquake = features.getJSONObject(i);
// For a given earthquake, extract the JSONObject associated with the
// key called "properties", which represents a list of all properties
// for that earthquake.
JSONObject properties = currentEarthquake.getJSONObject("properties");
double mag = properties.getDouble("mag");
String location = properties.getString("place");
long time = properties.getLong("time");
//extract the value of key url
String url = properties.getString("url");
//create new object with magnitude, location ane time and url from json response
Earthquake earthquake = new Earthquake(mag, location, time, url);
earthquakes.add(earthquake);
catch (JSONException e)
// If an error is thrown when executing any of the above statements in the "try" block,
// catch the exception here, so the app doesn't crash. Print a log message
// with the message from the exception.
Log.e("QueryUtils", "Problem parsing the earthquake JSON results", e);
// Return the list of earthquakes
return earthquakes;
logcat 显示:
09-26 14:49:23.628 2551-2584/com.example.android.quakereport E/com.example.android.quakereport.QueryUtils: Problem retrieving the earthquake JSON results.
【问题讨论】:
请提供您获得异常的日志 请发布错误日志、您正在解析的 JSON 数据以及您用于解析 JSON 的代码。 我看到你使用Index 10 out of range [0..10)
也许你使用for循环来获取对象?如果是真的,你应该检查你的循环索引。
1 - 未收到 JSON | 2 - JSON 与您的测试不同。
【参考方案1】:
您网址中的 json 数据格式不正确。将您从 url 收到的内容与硬编码的数据进行比较。
【讨论】:
url和硬编码的json数据相同earthquake.usgs.gov/fdsnws/event/1/…"。上面的json提取器代码有bug吗?【参考方案2】:使用在线 Json 验证器。 http://jsonlint.com/ 他们将验证 json 是否有问题。
【讨论】:
【参考方案3】:该方法在后台工作完成后在主 UI 线程上运行
完全的。此方法接收来自doInBackground()
方法的返回值作为输入。
首先我们清除适配器,以摆脱以前的地震数据 向 USGS 查询。
然后我们使用新的地震列表更新适配器,这将触发ListView
重新填充其列表项。 但在向适配器填充数据时出错。
@Override
protected void onPostExecute(List<Earthquake> data)
//clear the adapter of previdous earthquake data
mAdapter.clear();
if (data != null && data.isEmpty()) //====?????shourld be !data.isEmpty())
mAdapter.addAll(data);
真正的问题是onPostExecute
方法在后台方法中执行后在主线程中填充数据。
【讨论】:
您的日志显示:“09-26 14:49:23.628 2551-2584/com.example.android.quakereport E/com.example.android.quakereport.QueryUtils: 问题检索地震 JSON 结果”——当然和解析无关。【参考方案4】:如果您正在学习 Udacity android 课程并在 quakereport/DidUfeelIt 应用程序中遇到此错误,请更改 URL 并尝试使用其他 URL,您的问题将得到解决。 例如:- 课程期间提供的 URL 是 "http://earthquake.usgs.gov/fdsnws/event/1/query?format=geojson&starttime=2012-01-01&endtime=2012-12-01&minmagnitude=6"
然后我遇到了同样的错误,即“解析 JSON 时出现问题” 所以我尝试了不同的网址: https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/4.5_day.geojson
它奏效了..!! 在课程期间始终尝试从 USGS 网站获取最新的 URL。
【讨论】:
【参考方案5】:将您的请求 URL 更改为 USGS_REQUEST_URL="https://earthquake.usgs.gov/fdsnws/event/1/query?format=geojson&orderby=time&minmag=6&limit=10"
区别在于使用https而不是http。
根据 USGS 网站的 API 文档,该网站现在使用安全超文本传输协议 (https) https://earthquake.usgs.gov/fdsnws/event/1/
【讨论】:
以上是关于检索地震 JSON 结果时出现问题?的主要内容,如果未能解决你的问题,请参考以下文章
尝试从 sharedPreferences 检索地图时出现颤振错误
创建自定义 psobject 时出现 op_Subtraction 错误,尽管检索到了所需的结果
在 Python 中解析 JSON 结果时出现 KeyError