zoukankan      html  css  js  c++  java
  • 【转】 Json转换利器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>接口:

    mport 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]
    

      

  • 相关阅读:
    架构 框架 设计模式 --备用
    机器视觉项目开发之---织物疵点检测机器视觉系统 软件测试平台
    多媒体开发之--- live555 vs2010/vs2013下编译,使用,测试
    多媒体开发之--- h264 图像、帧、片、NALU
    多媒体开发之---H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流
    多媒体开发之---h264格式slice_header
    图像处理之基础---傅立叶c实现
    图像处理之基础---小波提取特征
    图像处理之基础---图像的特征简介
    嵌入式开发之工具---log file
  • 原文地址:https://www.cnblogs.com/daocaowu/p/3342000.html
Copyright © 2011-2022 走看看