Java Google Json (Gson) Serializing Inner classes – Studytrails (original) (raw)
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;
}
}}