Serializing inner classes
Gson can serialize inner classes and static nested classes. The detailed example below demonstrates the following things.
- Serializing class containing static nested class
- Serializing class containing non static nested class (Inner class)
- De-serializing json to a class containing static and non static inner class
- Serializing static nested class (without the enclosing type)
- Serializing non static nested class (without the enclosing type)
- De-serializing json to a static nested class (without the enclosing type)
- De-serializing json to a non static nested class (without the enclosing type)
The Example
package com.studytrails.json.gson; import java.lang.reflect.Modifier; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.studytrails.json.gson.AlbumsWithInnerClass.Dataset; import com.studytrails.json.gson.AlbumsWithInnerClass.Dataset2; public class SerializeInnerClassExample4 { public static void main(String[] args) { // create an Albums class with a static nested class and a non static // nested class AlbumsWithInnerClass albums = new AlbumsWithInnerClass(); albums.setName("SerializeInnerClass"); // create a dataset. we need the enclosing type since this is a non // static nested class (inner class) Dataset dataset = albums.new Dataset(); dataset.setAlbum_id("1"); dataset.setAlbum_name("albums1"); // assign the datasets to albums albums.setDatasetsInner(new Dataset[] { dataset }); // static inner class can be created without the enclosing type Dataset2 dataset2 = new Dataset2(); dataset2.setAlbum_id("2"); dataset2.setAlbum_name("albums2"); albums.setDatasetsStatic(new Dataset2[] { dataset2 }); // create the GsonBuilder GsonBuilder builder = new GsonBuilder(); // we ignore Private fields builder.excludeFieldsWithModifiers(Modifier.PRIVATE); Gson gson = builder.create(); // serialize the albums object String json = gson.toJson(albums); System.out.println(json); // prints // {"name":"SerializeInnerClass","datasetsInner":[{"album_name":"SerializeInnerClass_albums1","album_id":"1"}], // "datasetsStatic":[{"album_name":"albums2","album_id":"2"}]} // We read the json string now and recreate the AlbumsWithInnerClass class Gson gson3 = new Gson(); AlbumsWithInnerClass parsedAlbums = gson3.fromJson(json, AlbumsWithInnerClass.class); System.out.println(parsedAlbums.datasetsInner[0].album_name); // prints SerializeInnerClass_albums1 System.out.println(parsedAlbums.datasetsStatic[0].album_name); // prints albums2 // now lets try and serialize only the object of inner class Gson gson2 = new Gson(); String json2 = gson2.toJson(dataset); System.out.println(json2); // prints {"album_name":"SerializeInnerClass_albums1","album_id":"1"} // serialize nested static class String json3 = gson2.toJson(dataset2); System.out.println(json3); // prints {"album_name":"albums2","album_id":"2"} // let us now create the inner class from the json string Gson gson4 = new Gson(); Dataset parsedDataset = gson4.fromJson(json2, Dataset.class); System.out.println(parsedDataset.getClass()); // prints class com.studytrails.json.gson.AlbumsWithInnerClass$Dataset System.out.println(parsedDataset.album_name); // prints SerializeInnerClass_albums1 // create nested static class from the json string Dataset2 parsedStaticNestedClass = gson4.fromJson(json3, Dataset2.class); System.out.println(parsedStaticNestedClass.getClass()); // prints class com.studytrails.json.gson.AlbumsWithInnerClass$Dataset2 System.out.println(parsedStaticNestedClass.album_name); // prints albums2 } }
The AlbumsWithInnerClass
package com.studytrails.json.gson; public class AlbumsWithInnerClass { public String name; private String year; public Dataset[] datasetsInner; public Dataset2[] datasetsStatic; public void setDatasetsInner(Dataset[] datasetsInner) { this.datasetsInner = datasetsInner; } public void setDatasetsStatic(Dataset2[] datasetsStatic) { this.datasetsStatic = datasetsStatic; } public void setName(String name) { this.name = name; } public void setYear(String year) { this.year = year; } class Dataset { public String album_name; public String album_id; public void setAlbum_id(String album_id) { this.album_id = album_id; } public void setAlbum_name(String album_name) { this.album_name = name + "_" + album_name; } } static class Dataset2 { public String album_name; public String album_id; public void setAlbum_id(String album_id) { this.album_id = album_id; } public void setAlbum_name(String album_name) { this.album_name = album_name; } } }
Thank you, very helpful.
Hi,
What about this issue :
https://github.com/google/gson/issues/534
any thought on that please ?