Using Enums while parsing JSON with GSON Using Enums while parsing JSON with GSON java java

Using Enums while parsing JSON with GSON


I want to expand a bit NAZIK/user2724653 answer (for my case). Here is a Java code:

public class Item {    @SerializedName("status")    private Status currentState = null;    // other fields, getters, setters, constructor and other code...    public enum Status {        @SerializedName("0")        BUY,        @SerializedName("1")        DOWNLOAD,        @SerializedName("2")        DOWNLOADING,        @SerializedName("3")        OPEN     }}

in the json file you have just a field "status": "N",, where N=0,1,2,3 - depend on the Status values. So that's all, GSON works fine with the values for the nested enum class. In my case i've parsed a list of Items from json array:

List<Item> items = new Gson().<List<Item>>fromJson(json,                                          new TypeToken<List<Item>>(){}.getType());


From the documentation for Gson:

Gson provides default serialization and deserialization for Enums... If you would prefer to change the default representation, you can do so by registering a type adapter through GsonBuilder.registerTypeAdapter(Type, Object).

Following is one such approach.

import java.io.FileReader;import java.lang.reflect.Type;import java.util.List;import com.google.gson.Gson;import com.google.gson.GsonBuilder;import com.google.gson.JsonDeserializationContext;import com.google.gson.JsonDeserializer;import com.google.gson.JsonElement;import com.google.gson.JsonParseException;public class GsonFoo{  public static void main(String[] args) throws Exception  {    GsonBuilder gsonBuilder = new GsonBuilder();    gsonBuilder.registerTypeAdapter(AttributeScope.class, new AttributeScopeDeserializer());    Gson gson = gsonBuilder.create();    TruncateElement element = gson.fromJson(new FileReader("input.json"), TruncateElement.class);    System.out.println(element.lower);    System.out.println(element.upper);    System.out.println(element.delimiter);    System.out.println(element.scope.get(0));  }}class AttributeScopeDeserializer implements JsonDeserializer<AttributeScope>{  @Override  public AttributeScope deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)      throws JsonParseException  {    AttributeScope[] scopes = AttributeScope.values();    for (AttributeScope scope : scopes)    {      if (scope.scope.equals(json.getAsString()))        return scope;    }    return null;  }}class TruncateElement{  int lower;  int upper;  String delimiter;  List<AttributeScope> scope;}enum AttributeScope{  TITLE("${title}"), DESCRIPTION("${description}");  String scope;  AttributeScope(String scope)  {    this.scope = scope;  }}


Use annotation @SerializedName:

@SerializedName("${title}")TITLE,@SerializedName("${description}")DESCRIPTION