Gsonの例6-Type Adapterの登録および処理Enumタイプ

3414 ワード

列挙タイプは私たちのプログラムにメリットをもたらし、どのようにGsonでJsonとの相互回転を実現しますか?本文を見てください.
本文は自分でTypeAdapterを書く方法とTypeAdapterを登録する方法とEnumタイプを処理する方法に重点を置いている.
エンティティークラス:
public enum PackageState {PLAY, UPDATE, UPDATING, DOWNLOAD, DOWNLOADING,}
public class PackageItem {
    private String name;    
    private PackageState state;    
    private String size;        
    public String getName() {   
        return name;    
    }        
    public void setName(String name) {        
        this.name = name;    
    }    
    public PackageState getState() {
        return state;    
    }  
    public void setState(PackageState state) {
    this.state = state;    
    }    
    public String getSize() {        
        return size;    
    }    
    public void setSize(String size) {        
        this.size = size;    
    }    
    @Override    
    public String toString() {        
        return "PackageItem [name=" + name + ", size=" + size + ", state="+ state + "]";    
    }
}

JsonSerializerインタフェースとjsonDeserializerインタフェースを実現するために、変換器を自分で書きます.
import java.lang.reflect.Type;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
public class EnumSerializer implements JsonSerializer<PackageState>,JsonDeserializer<PackageState> {    
    //     Json   ,  JsonSerializer<PackageState>      
    @Override    
    public JsonElement serialize(PackageState state, Type arg1,JsonSerializationContext arg2) {        
        return new JsonPrimitive(state.ordinal());    
    }   
     
    // json       ,  JsonDeserializer<PackageState>          
    @Override    
    public PackageState deserialize(JsonElement json, Type typeOfT,JsonDeserializationContext context) throws JsonParseException {        
        if (json.getAsInt() < PackageState.values().length)            
            return PackageState.values()[json.getAsInt()];            
            return null;     
    }
}

テストクラス:
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
public class GsonTest6 {    
    public static void main(String[] args) {        
        GsonBuilder gsonBuilder = new GsonBuilder();        
        gsonBuilder.registerTypeAdapter(PackageState.class,new EnumSerializer());        
        Gson gson = gsonBuilder.create();        
        PackageItem item = new PackageItem();        
        item.setName("item_name");        
        item.setSize("500M");        
        item.setState(PackageState.UPDATING);//    state            
        String s = gson.toJson(item);        
        System.out.println(s);        
        System.out.println("--------------------------------");        
        PackageItem retItem = gson.fromJson(s, PackageItem.class);        
        System.out.println(retItem);    
    }
}

出力結果(stateの対応する列挙タイプがintタイプに変換された結果):
{"name":"item_name","state":2,"size":"500M"}--------------------------------PackageItem [name=item_name, size=500M, state=UPDATING]