Gson的使用

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

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

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

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

(1)解析google

Gson gson = new Gson();
int i = gson.fromJson("100", int.class);              //100
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)生成spa

Gson gson = new Gson();
String jsonNumber = gson.toJson(100);       // 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)解析Jsoncode

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.属性重命名注解的使用blog

@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

相关文章
相关标签/搜索