Gson之实例六-注册TypeAdapter及处理Enum类型

枚举类型给我们的程序带来了好处,如何用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<T>接口和jsonDeserializer<T>接口:

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]


转载于:https://my.oschina.net/mbreath/blog/522365

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值