How do I deserialize an array of different objects using GSON

I get json like this

[
  {
    "albums" : [
      {"id":"0", "name":"name"},
      {"id":"1", "name":"name"}
    ],
    "name":"name"
  },
  {
    "tracks" : [
      {"id":"0", "name":"name", "duration":"3:30"},
      {"id":"1", "name":"name", "duration":"2:40"}
    ],
    "name":"name"
  },
  {
    "playlists" : [
      {"id":"0", "name":"name", "tracksCount":"3"},
      {"id":"1", "name":"name", "tracksCount":"40"}
    ],
    "name":"name"
  }
]

Of course, I implemented the Track, Album, and Playlist classes that contain all the fields and classes.

Tracks {
  String name;
  List<Track> tracks;
}
Albums {
  String name;
  List<Album> albums;
}
Playlists {
  String name;
  List<Playlist> playlists;
}

I am trying to deserialize it with

Gson gson = new Gson();
JsonResponse[] rez = gson.fromJson(str, JsonResponse[].class);

where is jsonresponse

class JsonResponse {
  Albums albums;
  Tracks tracks;
  Playlists playlists;
}

But I get the error:

11-20 19: 24: 55.210: E/AndroidRuntime (5432): FATAL EXCEPTION: main 11-20 19: 24: 55.210: E/AndroidRuntime (5432): com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: BEGIN_OBJECT, BEGIN_ARRAY 1 13 11-20 19: 24: 55.210: E/AndroidRuntime (5432): at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory $Adapter.read(ReflectiveTypeAdapterFactory.java:176) 11-20 19: 24: 55.210: E/AndroidRuntime (5432): at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory $1.read(ReflectiveTypeAdapterFactory.java:93) 11-20 19: 24: 55.210: E/AndroidRuntime (5432): at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory $Adapter.read(ReflectiveTypeAdapterFactory.java:172) 11-20 19: 24: 55.210: E/AndroidRuntime (5432): at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40) 11-20 19: 24: 55.210: E/AndroidRuntime (5432): at com.google.gson.internal.bind.ArrayTypeAdapter.read(ArrayTypeAdapter.java:72) 11-20 19: 24: 55.210: E/AndroidRuntime (5432): at com.google.gson.Gson.fromJson(Gson.java:803) 11-20 19: 24: 55.210: E/AndroidRuntime (5432): com.google.gson.Gson.fromJson(Gson.java:768) 11-20 19: 24: 55.210: E/AndroidRuntime (5432): com.google.gson.Gson.fromJson(Gson.java:717) 11-20 19: 24: 55.210: E/AndroidRuntime (5432): com.google.gson.Gson.fromJson(Gson.java:689) 11-20 19: 24: 55.210: 11-20 19: 24: 55.210: E/AndroidRuntime (5432): at android.os.ResultReceiver $MyRunnable.run(ResultReceiver.java:43) 11-20 19: 24: 55.210: E/AndroidRuntime (5432): at android.os.Handler.handleCallback(Handler.java:587) 11-20 19: 24: 55.210: E/AndroidRuntime (5432): at android.os.Handler.dispatchMessage(Handler.java:92) 11-20 19: 24: 55.210: E/AndroidRuntime (5432): at android.os.Looper.loop(Looper.java:130) 11-20 19: 24: 55.210: E/AndroidRuntime (5432): android.app.ActivityThread.main(ActivityThread.java:3687) 11-20 19: 24: 55.210: E/AndroidRuntime (5432): at java.lang.reflect.Method.invokeNative( ) 11-20 19: 24: 55.210: E/AndroidRuntime (5432): at java.lang.reflect.Method.invoke(Method.java:507) 11-20 19: 24: 55.210: E/AndroidRuntime (5432): com.android.internal.os.ZygoteInit $MethodAndArgsCaller.run(ZygoteInit.java:867) 11-20 19: 24: 55.210: E/AndroidRuntime (5432): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 11-20 19: 24: 55.210: E/AndroidRuntime (5432): at dalvik.system.NativeStart.main( ) 11-20 19: 24: 55.210: E/AndroidRuntime (5432): : java.lang.IllegalStateException: BEGIN_OBJECT, BEGIN_ARRAY 1 13 11-20 19: 24: 55.210: E/AndroidRuntime (5432): at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:374) 11-20 19: 24: 55.210: E/AndroidRuntime (5432): at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory $Adapter.read(ReflectiveTypeAdapterFactory.java:165) 11-20 19: 24: 55.210: E/AndroidRuntime (5432):... 21

P.S. json- .

[
  {
    "albums" : [
      {"id":"0", "name":"name"},
      {"id":"1", "name":"name"}
    ],
    "name":"name"
  }
 ]

, JSON?

, JSON. , .

+4
4

! .

public class JsonResponse {
    public static class Item {
        String name;
    }

    public static class Tracks extends Item {
        List<Track> tracks;
    }

    public static class Albums extends Item {
        List<Album> albums;
    }

    public static class Playlists extends Item {
        List<Playlist> playlists;
    }

    public static class JsonResponseDeserialize implements JsonDeserializer<List<? extends Item>> {
        Gson gson = new Gson();
        @Override
        public List<? extends Item> deserialize(JsonElement el, Type type, JsonDeserializationContext context) throws JsonParseException {
            List<Item> ls = new ArrayList<Item>();
            JsonArray jarr = el.getAsJsonArray();
            for (JsonElement e : jarr) {
                Item i;
                if (e.getAsJsonObject().get("tracks") != null){
                    i = gson.lsomJson(e, Tracks.class);
                    if (i != null) {
                        ls.add(i);
                        continue;
                    }
                }
                if (e.getAsJsonObject().get("albums") != null){
                    i = gson.lsomJson(e, Albums.class);
                    if (i != null) {
                        ls.add(i);
                        continue;
                    }
                }
                if (e.getAsJsonObject().get("playlists") != null){
                    i = gson.lsomJson(e, Playlists.class);
                    if (i != null) {
                        ls.add(i);
                        continue;
                    }
                }
            }
            return ls;
        }
    }

    private Tracks _tracks;
    private Albums _albums;
    private Playlists _playlists;
}

:

private static List<? extends Item> getDatalsomJson(String jsonString) {
    Type type = new TypeToken<List<? extends JsonResponse.Item>>(){}.getType();
    GsonBuilder gb = new GsonBuilder();
    gb.registerTypeAdapter(type, new JsonResponse.JsonResponseDeserialize());
    Gson gson = gb.create();
    List<? extends Item> ls = gson.lsomJson(jsonString, type);
    return ls;
}
+1

    String json = "[{\"albums\":[{\"id\":\"0\",\"name\":\"name\"},{\"id\":\"1\",\"name\":\"name\"}],\"name\":\"name\"},{\"tracks\":[{\"id\":\"0\",\"name\":\"name\",\"duration\":\"3:30\"},{\"id\":\"1\",\"name\":\"name\",\"duration\":\"2:40\"}],\"name\":\"name\"},{\"playlists\":[{\"id\":\"0\",\"name\":\"name\",\"tracksCount\":\"3\"},{\"id\":\"1\",\"name\":\"name\",\"tracksCount\":\"40\"}],\"name\":\"name\"}]";

class JsonResponse {
      ArrayList<Album> albums;
      ArrayList<Track> tracks;
      ArrayList<Playlist> playlists;
      String name;
    @Override
    public String toString() {
        return "JsonResponse [albums=" + albums + ", tracks=" + tracks
                + ", playlists=" + playlists + ", name=" + name + "]";
    }     
}



class Track{
    int id;
    String name;
    String duration;
    @Override
    public String toString() {
        return "Track [id=" + id + ", name=" + name + ", duration=" + duration
                + "]";
    }    
}

class Album{
    int id;
    String name;
    @Override
    public String toString() {
        return "Album [id=" + id + ", name=" + name + "]";
    }   
}

class Playlist{ 
    int id;
    String name;
    int tracksCount;
    @Override
    public String toString() {
        return "Playlist [id=" + id + ", name=" + name + ", tracksCount="
                + tracksCount + "]";
    }

}

.

   JsonParser parser = new JsonParser();
   JsonArray Jarray = parser.parse(json).getAsJsonArray();
   Gson gson = new Gson();
   for(JsonElement obj : Jarray )
   {
        JsonResponse jsonResponse = gson.fromJson( obj , JsonResponse.class);
        System.out.println(jsonResponse);
   }
+1

JSON, , JSONResponse, JSON , . , :

[
  {
     {
       "albums" : [
         {"id":"0", "name":"name"},
         {"id":"1", "name":"name"}
       ],
       "name":"name"
     },
     {
       "tracks" : [
         {"id":"0", "name":"name", "duration":"3:30"},
         {"id":"1", "name":"name", "duration":"2:40"}
       ],
       "name":"name"
     },
     {
       "playlists" : [
         {"id":"0", "name":"name", "tracksCount":"3"},
         {"id":"1", "name":"name", "tracksCount":"40"}
       ],
       "name":"name"
     }
   }
]

, , , JSONDeserializer GSONBuilder , create() .

0

You actually made a mistake in the JsonResponse class.

Its a clear form of your json format, which starts with an array, and in the JsonResponse class, you simply compose a separate object, not a collection of the object. If you look closely at the Gson exception as " BEGIN_OBJECT but was BEGIN_ARRAY". This means that Gason has an array of albums, tracks, and a PlayList, and not an object of the "Albums", "Tracks", and "Playlists" class.

You just need to slightly modify the JsonResponse class below

private  List<Albums> albums;
private  List<Tracks> tracks;
private  List<Playlists> playlists;
0
source

All Articles