检索地震 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

使用从 JSON 数据中提取的值时出现 NSInvalidArgumentException

检索加密哈希响应上的 id

从 MVC .Net 核心控制器读取 JSON 时出现问题