gson的使用分享

一、 最基本的对象与JSON相互转换
1、 定义java对象
public class ModelObject {
    	private String name;
    	private int val;
    	private boolean status;
    	private double f;
    	private Date time;
    
    	private Object obj;
    	//get 与set方法
}


2、 相互转换的代码:
Gson gson = new Gson();
        
        ModelObject modelObject = new ModelObject();
        modelObject.setName("我的");
        modelObject.setVal(12);
        modelObject.setF(10.01);
        modelObject.setStatus(true);
        modelObject.setTime(new Date());
        
        String json = gson.toJson(modelObject);
        System.out.println(json);
        
        ModelObject modelObject1 = gson.fromJson(json, ModelObject.class);
        System.out.println(modelObject1.getF());
        
        Map<String, Object> map = gson.fromJson(json, Map.class);
        System.out.println(map.get("name"));


以上用到两种转换
gson.toJson(object) //把对象转成JSON字符串
gson.fromJson(jsonStr,class)//把json字符串,转为对象

二、 针对泛型的转换
1、 定义泛型
public class GenericModel<T> {
    		T vlue;
    		public GenericModel(T value){
        	super();
        	this.vlue = value;
    		}
}

2、 转换方法
private static void typeJson(){
        Gson gson = new Gson();
        ModelObject modelObject = new ModelObject();
        modelObject.setName("我的");
        modelObject.setF(10.01);
        GenericModel<ModelObject> model = new GenericModel<ModelObject>(modelObject);
        
        //输出JSON
        String json = gson.toJson(model);
        System.out.println("json representation:"+json);
        
        //返回泛型的对象
        Type collectionType = new TypeToken<GenericModel<ModelObject>>(){}.getType();
        GenericModel<ModelObject> model1= gson.fromJson(json, collectionType);
        System.out.println(model1.vlue.getName());
        
        List<Object> listOfString = new ArrayList<Object>();
        listOfString.add("列表1");
        listOfString.add("列表2");
        ModelObject tt = new ModelObject();
        String tt1 =  gson.toJson(listOfString);
        tt.setObj(tt1);
        
        //输出JSON
        String json2 = gson.toJson(tt);
        System.out.println("json representation:"+json2);
        
        //返回泛型的对象
        Type collectionType2 = new TypeToken<List<String>>(){}.getType();
        ModelObject model2= gson.fromJson(json2, ModelObject.class);
        List<String> mo = gson.fromJson((String)model2.getObj(), collectionType2);
        System.out.println(mo);
    }

GSON把JSON转换为JAVA泛型对象时,要先定义好
Type collectionType2 = new TypeToken<Object>(){}.getType(); 

告诉到底用什么类型,然后再用fromjson方法。
三、 使用setPrettyPrinting进行json的格式化
在使用setPrettyPrinting之前,打印的json为
{"name":"我的","val":12,"status":true,"f":10.01,"time":"2015-04-07 10:30:22"}

在使用setPrettyPrinting之后,打印的json为
{
  		"name": "我的",
  		"val": 12,
  		"status": true,
  		"f": 10.01,
  		"time": "2015-04-07 10:30:43"
}


使用方法为
Gson gson = new GsonBuilder().setPrettyPrinting().create();

           
四、 使用setDateFormat进行json的时间进行格式化
项目中使用日期一般为DATE类型,有时不满足我们展示的要求,这时需要对日期进行格式化,GSON提供了setDateFormat的方法。
在使用setDateFormat之前,日期json为:
{
  		"name": "我的",
  		"val": 12,
  		"status": true,
  		"f": 10.01,
  		"time": "Apr 7, 2015 10:34:30 AM"
}

在使用setDateFormat之后,日期json为:
{
  		"name": "我的",
  		"val": 12,
  		"status": true,
  		"f": 10.01,
  		"time": "2015-04-07 10:35:05"
}

使用方法为

Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss")// 时间转化为特定格式
.setPrettyPrinting() // 对json结果格式化
.create();

五、 使用transient指定不需要转换为json的属性
项目中,GSON的转换有时不需要过多的属性,需要对有些属性进行隐藏
可在对象中指定属性为transient类型如
private transient boolean status;

如果在转为JSON时,此属性就不会出现。
六、 使用Expose注解,指定哪些属性需要转换为JSON
使用方法为excludeFieldsWithoutExposeAnnotation():
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss")// 时间转化为特定格式
            .setPrettyPrinting() // 对json结果格式化
            .excludeFieldsWithoutExposeAnnotation() //需要指定要暴露转换的属性
            .create();

在对象中加入@Expose即可:
@Expose
private boolean status;

如果与transient同时存在,也不会转换。
七、 实体中属性的首字母大写
在GSON可以设计转成的JSON字符串属性首字母大写,也可以在属性中加入
@SerializedName(value = "ddf")
,来改变JSON字符串的属性值
使用方法为
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss")// 时间转化为特定格式
            .setPrettyPrinting() // 对json结果格式化
            .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)//会把字段首字母大写,注:对于实体中@SerializedName注释的不会生效
            .create();

生成的JSON字符串为:
{
  "Name": "我的",
  "Val": 0,
  "Status": true,
  "F": 10.01,
  "Time": "2015-04-07 11:27:37"
}


如果在属性中加入
@SerializedName(value = "名称")
private String name;

生成的JSON字符串为
{
  "名称": "我的",
  "Val": 0,
  "Status": true,
  "F": 10.01,
  "Time": "2015-04-07 11:28:27"
}

八、 用版本来管理生成的JSON字符串
使用方法为:
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss")// 时间转化为特定格式
            .setPrettyPrinting() // 对json结果格式化
            .setVersion(1.0)    //版本管理
            .create();

实体中属性加入@Since(value = 1.0)即可,有的字段不是一开始就有的,会随着版本的升级添加进来,那么在进行序列化和返序列化的时候就会根据版本号来选择是否要序列化的。版本升级新的字段可以用@Since(value = 2.0)来标识。可用setVersion(2.0)找到新的字段。
有的字段可以随着版本的升级而删除,用@Until(value = 2.0)可以实现这个功能。
九、 通过GSON的适配器,对属性进行处理
使用方法
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss")// 时间转化为特定格式
            .registerTypeAdapter(PackageState.class,new EnumSerializer())//定义自己的适配器
            .create();

1、 PackageState为需要转换的值:
public enum PackageState {
    PLAY,UPDATE,UPDATEING,DOWNLOAD,DOWNLOADING,
}

2、 EnumSerializer需要实现序列与反序列
public class EnumSerializer implements JsonSerializer<PackageState>, JsonDeserializer<PackageState> {

    @Override
    public PackageState deserialize(JsonElement arg0, Type arg1, JsonDeserializationContext arg2)
        throws JsonParseException {
        if(arg0.getAsInt()<PackageState.values().length)
            return PackageState.values()[arg0.getAsInt()];
        return null;
    }
    
    @Override
    public JsonElement serialize(PackageState arg0, Type arg1, JsonSerializationContext arg2) {
        // TODO Auto-generated method stub
        return new JsonPrimitive(arg0.ordinal());
    }
}


3、 处理类
public static void main(String[] args) {
        GsonBuilder builder = new GsonBuilder();
        builder.registerTypeAdapter(PackageState.class,new EnumSerializer());   //适配器
        Gson gson = builder.create();
        PackageItem item = new PackageItem();
        item.setName("每一天");
        item.setSize("500M");
        item.setState(PackageState.UPDATEING);
        
        String json = gson.toJson(item);
        System.out.println(json);
        
        String tt = "{\"name\":\"每一天\",\"state\":2,\"size\":\"500M\"}";
        
        PackageItem retItem = gson.fromJson(tt, PackageItem.class);
        System.out.println(retItem.getState());
}

返回的retItem.getState()已经改变

猜你喜欢

转载自duanfei.iteye.com/blog/2271376