1

Help me parsing JSON. I parse this JSON without "moment" and don't know how parse with "moment". My JSON response:

{
"A": [
    {
        "time0_90": "20",
        "score": "0 : 0",
        "team1": "Россия",
        "team2": "Франция",
        "group": "A",
        "live": "1"
    },
    {
        "time0_90": "20",
        "score": "0 : 0",
        "team1": "Португалия",
        "team2": "Гондурас",
        "group": "A",
        "live": "0",
        "time": "18:30",
        "stadium": "",
        "referee": "судья"
    }
],
"B": [
    {
        "time0_90": "3",
        "score": "1 : 0",
        "moment": [
            {
                "class_moment": "g",
                "name1": "Халк",
                "time0_90Moment": "5",
                "team": "1"
            },
            {
                "class_moment": "sub",
                "name1": "Фред",
                "time0_90Moment": "50",
                "team": "1",
                "name2": "Жо"
            }
        ],
        "team1": "Бразилия",
        "team2": "Испания",
        "group": "B",
        "live": "1"
    }
],
"C": [],
"D": [],
"E": [],
"F": [
    {
        "time": "15:00",
        "stadium": "Маракана",
        "referee": "судья",
        "team1": "Россия",
        "team2": "Франция",
        "group": "F",
        "live": "0"
    }
],
"G": [],
"H": []
}

This code is parse response without "moment". How to parse response with "moment" and save it in array?

JSONObject jsonResponse = new JSONObject(jsonResult);
   for (int j=0; j<8; j++){
       String[] groupName = {"A", "B", "C", "D", "E", "F", "G", "H"};
   JSONArray jsonMainNode = jsonResponse.optJSONArray(groupName[j]);
   if (jsonMainNode.length() == 0){ continue;}
   else {
   for (int i = 0; i < jsonMainNode.length(); i++) {
    JSONObject jsonChildNode = jsonMainNode.getJSONObject(i);
    team1 = jsonChildNode.optString("team1");
    team2 = jsonChildNode.optString("team2");       
    group = jsonChildNode.optString("group");
    int live = jsonChildNode.getInt("live");
    String time = null;
    if (live == 1){
        time = jsonChildNode.optString("time0_90")+"'";
        score = jsonChildNode.optString("score");
        }
        else {
            score = jsonChildNode.optString("time");
            referee = jsonChildNode.optString("referee");
            time = jsonChildNode.optString("stadium");
            }

3 Answers 3

1

try this :

jsonArray moment = json.getJsonArray("B").getJsonObject(0).getJsonArray("moment");
String class = moment.getString("class_moment");
String name= moment.getString("name1");
String time= moment.getString("time0_90Moment");
String team= moment.getString("team");
Sign up to request clarification or add additional context in comments.

Comments

1

I would recommend that you use a JSON Mapping library, like Jackson or GSON, manually parsing JSON is a waste of time and effort unless it is purely for educational purposes.

Other than that I assume the correct usage would be .optJSONArray("moment") follow by an iteration with a cast of each result to JSONObject or similar? Manually doing this is just a mess. ;o

Comments

0

I did it, here's the code

JSONObject jsonResponse = new JSONObject(jsonResult);
       for (int j=0; j<8; j++){
           String[] groupName = {"A", "B", "C", "D", "E", "F", "G", "H"};
       JSONArray jsonMainNode = jsonResponse.optJSONArray(groupName[j]);
       if (jsonMainNode.length() == 0){ continue;}
       else {
       for (int i = 0; i < jsonMainNode.length(); i++) {
        JSONObject jsonChildNode = jsonMainNode.getJSONObject(i);
        team1 = jsonChildNode.optString("team1");
        team2 = jsonChildNode.optString("team2");       
        group = jsonChildNode.optString("group");
        int live = jsonChildNode.getInt("live");
        String time = null;
        if (live == 1){
            time = jsonChildNode.optString("time0_90")+"'";
            score = jsonChildNode.optString("score");
            JSONArray jsonMoment = jsonChildNode.optJSONArray("moment");
            if (jsonMoment == null)
                {
                class_moment=new String[1];
                name1 = new String[1];
                name2 = new String[1];
                name1 = new String[1];
                time0_90Moment = new String[1];
                team = new int[1];
                }
               else {
                   class_moment=new String[jsonMoment.length()];
                    name1 = new String[jsonMoment.length()];
                    name2 = new String[jsonMoment.length()];
                    name1 = new String[jsonMoment.length()];
                    time0_90Moment = new String[jsonMoment.length()];
                    team = new int[jsonMoment.length()];
            for (int k = 0; k < jsonMoment.length(); k++) { 
                JSONObject jsonChildMoment = jsonMoment.getJSONObject(k);               
                class_moment[k] = jsonChildMoment.optString("class_moment");                
                name1[k] = jsonChildMoment.optString("name1");
                name2[k] = jsonChildMoment.optString("name2");
                time0_90Moment[k] = jsonChildMoment.optString("time0_90Moment");
                team[k] = jsonChildMoment.getInt("team");              
            }}          
            }
            else {
                score = jsonChildNode.optString("time");
                referee = jsonChildNode.optString("referee");
                time = jsonChildNode.optString("stadium");
                }

1 Comment

Seems you did more or less what I wrote using optJSONArray and iterating + using JSONObject. Accepting the answer would be good. Other than that, using a mapper is still vastly superior and would take about 1/100th of the time compared to writing this code.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.