`
duanfei
  • 浏览: 733527 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

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()已经改变
分享到:
评论

相关推荐

    gson.jar包资源

    好不容易找到的gson的jar包,上传分享。谢谢支持! Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。可以将一个 JSON 字符串转成一个 Java 对象,或者反过来。

    Gson.jar gson-2.7.jar GSON jar包

    Gson.jar gson-2.7.jar GSON jar包 gson需要的所有jar,这是自己用的,保证稳定可用,现在分享给大家啦~~~欢迎下载讨论!

    使用Google的Gson实现对象和json字符串之间的转换

    本文将深入探讨如何利用Gson库进行对象到JSON以及JSON到对象的转换,并分享一个示例项目——GsonDemo。 首先,让我们了解Gson库的基本概念。Gson是Google开发的一个开源库,它的主要功能是将Java对象转换为它们对应...

    Json包(包含gson-2.8.0.jar)

    在Java项目中,通常会将依赖的第三方库以JAR文件的形式添加到项目的类路径中,以便在编译和运行时使用其功能。 在"压缩包子文件的文件名称列表"中,只列出了"Json包",这意味着压缩包可能只有一个文件,即gson-...

    gson-2.2.2.jar

    json解析工具Google官网提供 分享给大家学习

    gson-2.2.4.jar

    javaweb/javaee 常用jar包,亲测可用,若需其他版本其他jar包请留言我看到后会上传分享

    gson-2.8.0.jar

    javaweb/javaee 常用jar包,亲测可用,若需其他版本其他jar包请留言我看到后会上传分享

    gson-1.7.1.jar

    javaweb/javaee 常用jar包,亲测可用,若需其他版本其他jar包请留言我看到后会上传分享

    gson-2.6.2.jar

    javaweb/javaee 常用jar包,亲测可用,若需其他版本其他jar包请留言我看到后会上传分享

    gson-2.3.jar

    javaweb/javaee 常用jar包,亲测可用,若需其他版本其他jar包请留言我看到后会上传分享

    gson-2.6.jar

    javaweb/javaee 常用jar包,亲测可用,若需其他版本其他jar包请留言我看到后会上传分享

    gson-2.3.1.jar

    javaweb/javaee 常用jar包,亲测可用,若需其他版本其他jar包请留言我看到后会上传分享

    java获取一些视频分享信息

    在Java编程语言中,获取视频分享信息涉及到网络编程、数据解析和可能的API交互。这里我们将探讨如何使用Java实现这一目标,以及与之相关的技术点。 首先,我们需要明确获取视频分享信息的方式。通常,这可以通过...

    SpringBoot_113实用知识库分享

    SpringBoot 提供了多种方式来实现 RESTful API 接口统一 JSON 格式返回,包括使用 Jackson 库、使用 Gson 库、使用 Fastjson 库等。 4. SpringBoot Validation 优雅的全局参数校验 SpringBoot 提供了多种方式来...

    基于javaweb的 微信网页分享 获取Token

    在JavaWeb环境下,可以使用Http客户端库(如Apache HttpClient或OkHttp)发起HTTP请求,获取所需的JSON响应,然后使用JSON解析库(如Jackson或Gson)进行解析。 在获取微信Token的过程中,由于Token的有效期通常较...

    java获取百度网盘分享的真实地址并下载

    - 如果返回的是JSON数据,可以使用Gson或Jackson库进行解析。 5. **下载文件**: - 一旦找到真实下载地址,就可以使用`java.nio`包或者第三方库如`Apache Commons IO`来下载文件。设定输出流,将文件内容写入本地...

    VolleyDemo

    VolleyDemo是一个示例项目,展示了如何在Android应用中使用Volley进行网络请求,并进行了分享功能的扩展,以及使用Gson库将JSON数据转换为对象。 首先,Volley的核心组件包括RequestQueue、NetworkDispatcher和...

    天气预报java版 给大家分享

    Java中可以使用Gson、Jackson或org.json等库来解析JSON。例如,使用Gson解析JSON数据: ```java Gson gson = new Gson(); WeatherData weatherData = gson.fromJson(responseStream, WeatherData.class); ``` 这里...

    基于android的移动应用手机游戏分享客户端源码.zip

    可能还涉及到JSON解析,如使用Gson或Jackson库将服务器返回的数据转化为Java对象。 3. **数据存储**:本地数据存储可能使用SQLite数据库保存用户偏好、已下载游戏等信息。同时,SharedPreferences用于存储轻量级...

    Android 平台下手机相册分享

    - 可以使用`Intent.createChooser()`创建自定义的分享选择器。 8. **测试与调试**: - 使用单元测试框架如JUnit测试代码逻辑, Espresso进行UI测试。 - 使用Android Studio的调试工具进行性能分析和内存泄漏检查...

Global site tag (gtag.js) - Google Analytics