GSON:是Google开发的Java API,用于转换Java对象和Json对象

<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.7</version>
</dependency>

Gson提供了fromJson()toJson() 两个直接用于解析和生成的方法,前者实现反序列化,后者实现了序列化。同时每个方法都提供了重载方法。

1.基本数据类型的生成与解析

(1)解析

Gson gson = new Gson();
int i = gson.fromJson("100", int.class); //
double d = gson.fromJson("\"99.99\"", double.class); //99.99
boolean b = gson.fromJson("true", boolean.class); // true
String str = gson.fromJson("String", String.class); // String

(2)生成

Gson gson = new Gson();
String jsonNumber = gson.toJson(100); //
String jsonBoolean = gson.toJson(false); // false
String jsonString = gson.toJson("String"); //"String"

2.POJO类的生成与解析

public class User {
//省略其它
public String name;
public int age;
public String emailAddress;
}

(1)解析Json

Gson gson = new Gson();
String jsonString = "{\"name\":\"怪盗kidou\",\"age\":24}";
User user = gson.fromJson(jsonString, User.class);

(2)生成Json

Gson gson = new Gson();
User user = new User("怪盗kidou",24);
String jsonObject = gson.toJson(user); // {"name":"怪盗kidou","age":24}

3.属性重命名注解的使用

@SerializedName(value = "emailAddress", alternate = {"email", "email_address"})
public String emailAddress;

当上面的三个属性(email_address、email、emailAddress)中出现任意一个时均可以得到正确的结果。

4.Gson中使用泛型

例:JSON字符串数组 ["Android","Java","PHP"]

当我们要通过Gson解析这个json时,一般有两种方式:使用数组,使用List。而List对于增删都是比较方便的,所以实际使用是还是List比较多。

数组比较简单:

Gson gson = new Gson(); 
String jsonArray = "[\"Android\",\"Java\",\"PHP\"]";
String[] strings = gson.fromJson(jsonArray, String[].class);

但对于List将上面的代码中的 String[].class 直接改为 List<String>.class 是行不通的。对于Java来说List<String> 和List<User> 这俩个的字节码文件只一个那就是List.class,这是Java泛型使用时要注意的问题 泛型擦除。 为了解决的上面的问题,Gson为我们提供了TypeToken来实现对泛型的支持,所以当我们希望使用将以上的数据解析为List<String>时需要这样写。

Gson gson = new Gson();
String jsonArray = "[\"Android\",\"Java\",\"PHP\"]";
String[] strings = gson.fromJson(jsonArray, String[].class);
List<String> stringList = gson.fromJson(jsonArray, new TypeToken<List<String>>() {}.getType());

注:TypeToken的构造方法是protected修饰的,所以上面才会写成new TypeToken<List<String>>() {}.getType() 而不是  new TypeToken<List<String>>().getType()

泛型解析对接口POJO的设计影响泛型的引入可以减少无关的代码,如我现在所在公司接口返回的数据分为两类:

{"code":"0","message":"success","data":{}}
{"code":"0","message":"success","data":[]}

我们真正需要的data所包含的数据,而code只使用一次,message则几乎不用。如果Gson不支持泛型或不知道Gson支持泛型的同学一定会这么定义POJO。

public class UserResponse {
public int code;
public String message;
public User data;
}

当其它接口的时候又重新定义一个XXResponse将data的类型改成XX,很明显code,和message被重复定义了多次,通过泛型的话我们可以将code和message字段抽取到一个Result的类中,这样我们只需要编写data字段所对应的POJO即可,更专注于我们的业务逻辑。如:

public class Result<T> {
public int code;
public String message;
public T data;
}

那么对于data字段是User时则可以写为 Result<User> ,当是个列表的时候为 Result<List<User>>,其它同理。

如Result.java:

import com.alibaba.fastjson.JSONObject;
import java.util.HashMap;
import java.util.List;
import java.util.Map; public class Result<T> {
public Map success(Object data) {
Map<String, Object> map = new HashMap<>();
map.put("code", ResultStatus.SUCCESS);
map.put("message", "process successfully!");
map.put("data", data);
return map;
} public Map success(List<T> data) {
Map<String, Object> map = new HashMap<>();
map.put("status", "success");
map.put("msg", "process successfully!");
map.put("data", data);
return map;
} public Map success(List<T> data, JSONObject additional) {
Map<String, Object> map = new HashMap<>();
map.put("status", "success");
map.put("msg", "process successfully!");
map.put("data", data);
map.put("additional", additional);
return map;
} public Map fail(String msg) {
Map<String, Object> map = new HashMap<>();
map.put("status", "failure");
map.put("msg", msg);
map.put("data", "");
return map;
} public Map result(ResultStatus status, String msg, Object data) {
Map<String, Object> map = new HashMap<>();
if (status.getName().equals("success")) {
map.put("status", "success");
} else {
map.put("status", "failure");
}
map.put("msg", msg);
map.put("data", data);
return map;
}
}

5.Gson的流式反序列化

Gson.toJson(Object);
Gson.fromJson(Reader,Class);
Gson.fromJson(String,Class);
Gson.fromJson(Reader,Type);
Gson.fromJson(String,Type);

原文链接:http://www.jianshu.com/p/e740196225a4

Gson的使用的更多相关文章

  1. No-args constructor for class X does not exist. Register an InstanceCreator with Gson for this type to fix this problem.

    Gson解析JSON字符串时出现了下面的错误: No-args constructor for class X does not exist. Register an InstanceCreator ...

  2. Gson将字符串转换成JsonObject和JsonArray

    以下均利用Gson来处理: 1.将bean转换成Json字符串: public static String beanToJSONString(Object bean) { return new Gso ...

  3. Gson解析纯Json数组

    [ { "type": "123", "value": 123 }, { "type": "234" ...

  4. 【Gson】互相转化

    Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库.可以将一个 JSON 字符串转成一个 Java 对象,或者反过来. 对象转为字符串 Strin ...

  5. Android Gson解析

    目前解析json有三种工具:org.json(Java常用的解析),fastjson(阿里巴巴工程师开发的),Gson(Google官网出的),解析速度最快的是Gson,下载地址:https://co ...

  6. Android总结之json解析(FastJson Gson 对比)

    前言: 最近为了统一项目中使用的框架,发现项目中用到了两种json解析框架,他们就是当今非常主流的json解析框架:google的Gson 和阿里巴巴的FastJson,为了废除其中一个所以来个性能和 ...

  7. gson笔记 解析json数据

    gson中负责json数据解析的类是JsonReader. Json格式有两种结构,一种是对象(键值对的组合,无序),另外一种是数组(值的有序集合). 因此针对这两种格式,JsonReader提供了不 ...

  8. Android Gson的使用总结

    1.概念 Gson是谷歌发布的一个json解析框架 2.如何获取 github:https://github.com/google/gson android studio使用 compile 'com ...

  9. Android JSON、GSON、FastJson的封装与解析

    声明: 1.本帖只提供代码,不深入讲解原理.如果读者想要深入了解,那就不要在这个帖子上浪费时间了 2.客户端用的是Google官方的Volley访问服务器,具体了解Volley请戳 这里 3.本帖三种 ...

  10. Java Gson 简要笔记

    Gson是Google开发的Java比较好用的 Json工具. 使用挺简单,假设有个类: class Runner { int attr; String name; public Runner(int ...

随机推荐

  1. MFC如何隐藏RibbonBar的QAT QuickAccessToolBar(快速访问工具栏)

    在CMainFrame的中的OnCreate函数中找到 m_wndRibbonBar.LoadFromResource(IDR_RIBBON); 在这一行的下面添加 CMFCRibbonQuickAc ...

  2. iOS Block循环引用

    在介绍block循环引用前我们先了解一下typeof. typeof是什么??? typeof 是一个一元运算,放在一个运算数之前,运算数可以是任意类型. 它返回值是一个字符串,该字符串说明运算数的类 ...

  3. stm32f10x .icf文件 可以看懂

    /*###ICF### Section handled by ICF editor, don't touch! ****//*-Editor annotation file-*//* IcfEdito ...

  4. DotNetBar 第1课,设置整体窗口样式

    1. 先引用 DevComponents.DotNetBar2.dll 2. 窗口继承 Office2007Form public partial class Form1 : Office2007Fo ...

  5. LPTHW 笨办法学python 33章

    32-33章节 将for-loop和while-loop循环的. 俩种句法就不说了.简单说下个人对于for和while的理解. 我觉得他learn python the hard way这里的写法是, ...

  6. 关于MySQL5.6.25在Win7 64bit下重装后无法启动的解决方法

    在重装MySQL5.6.25安装到进行配置的时候,一直在等待服务的启动.如果手动在系统服务启动会提示1067错误,这个错误在网上很常见,然而我试过了很多方法均无法解决. 于是看ProgramData\ ...

  7. Elasticsearch Network Settings

    网络设置 Elasticsearch 缺省情况下是绑定 localhost.对于本地开发服务是足够的(如果你在相同机子上启动多个节点,它还可以形成一个集群),但是你需要配置基本的网络设置,为了能够在实 ...

  8. keras 入门之 regression

    本实验分三步: 1. 建立数据集 2. 建立网络并训练 3. 可视化 import numpy as np from keras.models import Sequential from keras ...

  9. PHP character garbled

    MySql  控制台查询时出现乱码 Database&Table 的字符集 于Mysql控制台显示的字符集不一样 右键单击mysql控制台边框  单击属性  查看当前代码页的字符集模式是否于数 ...

  10. Android proguard 详解

    本文转载于:http://blog.csdn.net/banketree/article/details/41928175 简介 Java代码是非常容易反编译的.为了很好的保护Java源代码,我们往往 ...