简体   繁体   English

JsonObject JsonArray解析问题

[英]JsonObject JsonArray parsing issue

I'm new to JSON, but have had success pulling data from a couple other JSON request. 我是JSON的新手,但已经成功地从其他JSON请求中提取数据。 This one is giving me trouble. 这给我带来麻烦。 Any help or pointers would be appreciated. 任何帮助或指针,将不胜感激。

This is the JSON request: http://api.wunderground.com/api/95e20de6002dc6f0/currenthurricane/view.json 这是JSON请求: http : //api.wunderground.com/api/95e20de6002dc6f0/currenthurricane/view.json

That above pulls down the data I am wanting. 以上就是我想要的数据。

Below is my code that I am having trouble with: 以下是我遇到问题的代码:

public static ArrayList<CycloneData> extractFeatureFromJson(String cycloneJSON) {

    // Create an empty ArrayList to start adding Cyclones to
    ArrayList<CycloneData> cyclones = new ArrayList<>();

    // try to parse the cycloneJSON response string. If there's a problem with the way the JSON
    // is formatted, a JSONException exception object will be thrown.
    // Catch the exception, and print the error message to the logs.

    try {

        JSONObject rootJsonObject = new JSONObject(cycloneJSON);

        // Create JSONArray associated with the key called "currenthurricane", which represents
        // a list of cyclones from JSON response.
        JSONArray currentHurricaneArray = rootJsonObject.getJSONArray("currenthurricane");

        //Loop through each section in the currentHurricaneArray array & create an
        //{@link CycloneData} object for each one
        for (int i = 0; i < currentHurricaneArray.length(); i++) {
            //Get cyclone JSONObject at position i in the array
            JSONObject cycloneProperties = currentHurricaneArray.getJSONObject(i);
            //Extract “stormName_Nice” for Cyclone's name
            String name = cycloneProperties.optString("stormName_Nice");
            // Extract the value for the key called "url"
            String url = cycloneProperties.optString("url");
            int category = cycloneProperties.optInt("SaffirSimpsonCategory");
            CycloneData cyclone = new CycloneData(category, name, url);
            //Add new cyclone to list
            cyclones.add(cyclone);
        }

    } 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("Utils", "Problem parsing the cyclone JSON results", e);
    }

    // Return the list of cyclones
    return cyclones;
}

Using the debugger in Android Studio, I can see that currentHurricaneArray in: JSONArray currentHurricaneArray = rootJsonObject.getJSONArray("currenthurricane"); 使用Android Studio中的调试器,我可以在以下代码中看到currentHurricaneArray: JSONArray currentHurricaneArray = rootJsonObject.getJSONArray("currenthurricane");

is getting the expected JSON array data. 正在获取预期的JSON数组数据。

When the for loop starts the JSONObject: JSONObject cycloneProperties = currentHurricaneArray.getJSONObject(i); 当for循环启动JSONObject时: JSONObject cycloneProperties = currentHurricaneArray.getJSONObject(i);

has the correct array info I'm looking for as well. 以及我正在寻找的正确数组信息。

However, after that when it starts extracting Strings. 但是,此后开始提取字符串。 String name = cycloneProperties.optString("stormName_Nice");

It returns nothing. 它什么也不返回。

Debug shows: name = "" 调试显示: name = ""

I am able to get the info I want if I use a JSON Query tool, but I cannot figure out how to get it working in my code. 如果使用JSON查询工具,我可以获得所需的信息,但是我不知道如何在代码中使用它。

I'm certain my String extraction is wrong, I just cannot figure out how to make it right. 我确定我的String提取错误,只是无法弄清楚如何正确处理。 Or maybe I'm wrong all they way up. 也许我一直都错了。

*************Good code Below******************* *************下面的好代码*******************

Ok Gaëtan Maisse got me going. 好吧,GaëtanMaisse让我走了。 Below is what I did to get it working. 以下是我为使其正常工作所做的事情。

for (int i = 0; i < currentHurricaneArray.length(); i++) {
            //Get cyclone JSONObject at position i in the array
            JSONObject cycloneProperties = currentHurricaneArray.getJSONObject(i);

            // Extract "stormInfo" object
            JSONObject stormInfo = cycloneProperties.optJSONObject("stormInfo");
            //Extract “stormName_Nice” & "requesturl" for Cyclone's name and url
            String name = stormInfo.optString("stormName_Nice");
            String url = stormInfo.optString("requesturl");

            // Extract "Current" object
            JSONObject Current = cycloneProperties.optJSONObject("Current");
            // Extract "SaffirSimpsonCategory" key
            int category = Current.optInt("SaffirSimpsonCategory");

            CycloneData cyclone = new CycloneData(category, name, url);
            //Add new cyclone to list
            cyclones.add(cyclone);
        }

optString(String name, String fallback), Returns the value mapped by name if it exists, coercing it if necessary, or fallback if no such mapping exists. optString(String name,String fallback),返回按名称映射的值(如果存在),如果需要则强制转换,如果没有这种映射则返回。 print fallback to test.if fallback is triggered then there is no key.This suggest either your json structure is malformed or your logic of parsing is unfit for the defined structure you are using. 打印回退到测试。如果回退被触发,则没有密钥。这表明您的json结构格式错误或您的解析逻辑不适合您使用的已定义结构。

You are missing JSON key stormInfo in your parsing process for stormName_Nice : 您在stormInfo的解析过程中缺少JSON密钥stormName_Nice

{
    "response": {
        "version": "0.1",
        "termsofService": "http://www.wunderground.com/weather/api/d/terms.html",
        "features": {
            "currenthurricane": 1
        }
    },
    "currenthurricane": [{
        "stormInfo": {
            "stormName": "Daniel",
            "stormName_Nice": "Hurricane Daniel",
            "stormNumber": "ep201204"
        },
        ...,
        "SaffirSimpsonCategory": 1,
        "url":"URL",
        ... 
    }]
}

It should better works with this: 它应该更好地与此配合使用:

JSONObject rootJsonObject = new JSONObject(cycloneJSON);

// Create JSONArray associated with the key called "currenthurricane", which represents
// a list of cyclones from JSON response.
JSONArray currentHurricaneArray = rootJsonObject.getJSONArray("currenthurricane");

//Loop through each section in the currentHurricaneArray array & create an
//{@link CycloneData} object for each one
for (int i = 0; i < currentHurricaneArray.length(); i++) {
    //Get cyclone JSONObject at position i in the array
    JSONObject cycloneProperties = currentHurricaneArray.getJSONObject(i);

    // Extract "stormInfo" object
    JSONObject stormInfo = cycloneProperties.getJSONObject("stormInfo");
    //Extract “stormName_Nice” for Cyclone's name
    String name = stormInfo.optString("stormName_Nice");

    // Extract other values from cycloneProperties
    String url = cycloneProperties.optString("url");
    int category = cycloneProperties.optInt("SaffirSimpsonCategory");
    CycloneData cyclone = new CycloneData(category, name, url);
    //Add new cyclone to list
    cyclones.add(cyclone);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM