How to walk a Json with Array

2

Good I am having problems to travel a json with array or that I think, I leave you the code json:

 {
    "username": "Pepiko",
    "platform": "pc",
    "stats": {
        "kills_solo": 1,
        "placetop1_solo": 0,
        "placetop10_solo": 1,
        "placetop25_solo": 1
    },
    "totals": {
        "kills": 13,
        "wins": 0,
        "kd": 0.41
    }
}

I have the problem to access, for example, "stats" or "totals". When I launch the emulator, it throws me the following Error:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 148 path $ .stats

I think he says he's waiting for an Array, but I think I'm passing him an object. The question is that I do not know how to get an array from a List

UserDrive.java

public class FichaUsuario {
         public String username;
         public String platform;
         public List<stats> stats;
}

stats.java

public class stats {
    public int kills_solo;
    public int placetop1_solo;
    public int placetop10_solo;
}

MainActivity.java

try {
    Response response = client.newCall(request).execute();
    if( response.isSuccessful() ){
        String jsonResponder = response.body().string();

        Log.d("Testeo", jsonResponder);
        Gson gson = new Gson(); // Carga Libreria Gson
        FichaUsuario fichaUsuario = gson.fromJson(jsonResponder, FichaUsuario.class);
        Log.d("Testeo", fichaUsuario.username + fichaUsuario.platform + fichaUsuario.stats.placetop10_solo);

    }else{
        Log.d("ERROR", response.body().string());
    }
} catch (IOException e) {
    e.printStackTrace();
}

What am I doing wrong? What steps should I follow to show the stats attributes of the json? I remember that I work with the library Gson, Thanks in advance Community.

P.D. I leave the complete message of the error that throws me.

     com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 148 path $.stats
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:226)
            at com.google.gson.Gson.fromJson(Gson.java:927)
            at com.google.gson.Gson.fromJson(Gson.java:892)
            at com.google.gson.Gson.fromJson(Gson.java:841)
            at com.google.gson.Gson.fromJson(Gson.java:813)
            at 
com.test.MainActivity$1.onClick(MainActivity.java:67)
            at android.view.View.performClick(View.java:6294)
            at android.view.View$PerformClick.run(View.java:24770)
            at android.os.Handler.handleCallback(Handler.java:790)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:164)
            at android.app.ActivityThread.main(ActivityThread.java:6494)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
         Caused by: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 148 path $.stats
            at com.google.gson.stream.JsonReader.beginArray(JsonReader.java:350)
            at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:80)
            at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61)
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:131)
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:222)
            at com.google.gson.Gson.fromJson(Gson.java:927) 
            at com.google.gson.Gson.fromJson(Gson.java:892) 
            at com.google.gson.Gson.fromJson(Gson.java:841) 
            at com.google.gson.Gson.fromJson(Gson.java:813) 
            at 
com.test.MainActivity$1.onClick(MainActivity.java:67) 
            at android.view.View.performClick(View.java:6294) 
            at android.view.View$PerformClick.run(View.java:24770) 
            at android.os.Handler.handleCallback(Handler.java:790) 
            at android.os.Handler.dispatchMessage(Handler.java:99) 
            at android.os.Looper.loop(Looper.java:164) 
            at android.app.ActivityThread.main(ActivityThread.java:6494) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 
    
asked by Fumatamax 29.09.2018 в 21:24
source

1 answer

3
"stats": {
    "kills_solo": 1,
    "placetop1_solo": 0,
    "placetop10_solo": 1,
    "placetop25_solo": 1
},

The point is that this is not an array (or list) at all, it is an object. The arrays are marked with brackets, even if they have only one element, or none. For this to be an array, it should be:

"stats": [{
    "kills_solo": 1,
    "placetop1_solo": 0,
    "placetop10_solo": 1,
    "placetop25_solo": 1
}],

So what you have to do:

public class FichaUsuario {
     public String username;
     public String platform;
     public stats stats;
}

In another order of things, the standard is that class names always start with capital letters.

    
answered by 29.09.2018 / 22:35
source