java解析json(四):gson

来源:互联网 发布:广电网络面临的形势 编辑:程序博客网 时间:2024/06/08 17:48

定义

GSON是谷歌提供的开源库,用来解析Json格式的数据

JAR包

gson-2.2.4.jar

主要API

Gson gson = new Gson();gson.fromJsongson.toJson

Gson的基本用法

基本数据类型与json相互转换

@Testpublic void JsonAndCommonType(){    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    System.out.println("i:"+i+"  d:"+d+"  b:"+b+"  str:"+str); //i:100  d:99.99  b:true  str:String    String intJson = gson.toJson(100);      String doubleJson = gson.toJson(99.99);    String booleanJson = gson.toJson(false);     String stringJson = gson.toJson("String");     System.out.println("intJson:" + intJson + "  doubleJson:" + doubleJson +"  booleanJson:"+booleanJson+"  stringJson:"+stringJson);    //intJson:100  doubleJson:99.99  booleanJson:false  stringJson:"String"}

简单Bean与json相互转换

Admin.java

class Admin{    private int id;    private String name;    private String emailAddress;    public Admin(){}    public Admin(int id, String name, String emailAddress) {        super();        this.id = id;        this.name = name;        this.emailAddress = emailAddress;    }    //省略getter/setter}

测试:

@Testpublic void SimpleBeanAndJson(){    Admin admin = new Admin();     Gson gson = new Gson();    String jsonStr = gson.toJson(admin);    System.out.println(jsonStr);        Admin admin2 = gson.fromJson(jsonStr, Admin.class);    System.out.println(admin2.getId()+"  "+admin2.getName()+"  "+admin2.getEmailAddress());}

运行结果:

{"id":1,"name":"nowuseeme","emailAddress":"nowuseeme@xx.com"}1  nowuseeme  nowuseeme@xx.com

上述运行结果,若是想让序列化结果名称改变下,如emailAddress改为email或者email_address可在对应的Bean添加注解@SerializedName 进行属性重命名,即

@SerializedName(value="email_address")private String emailAddress;

@SerializedName 还有个alternate 属性(jar包2.4版本及以上才有),反序列化转为bean时三个属性(email_address、email、emailAddress)都中出现任意一个时均可以得到正确的结果。

String jsonStr2 = "{\"id\":1,\"name\":\"nowuseeme\",\"email\":\"nowuseeme@xx.com\"}";Admin admin2 = gson.fromJson(jsonStr2, Admin.class);System.out.println(admin2.getId()+"  "+admin2.getName()+"  "+admin2.getEmailAddress()); //输出结果: 1  nowuseeme  nowuseeme@xx.com

Gson的流式反序列化

自动方式

比较常用的流式反序列化自动方式的重载方法

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

手动方式

手动的方式就是使用stream包下的JsonReader类来手动实现反序列化

@Testpublic void readAsReader(){    String json = "{\"id\":\"1\",\"name\":\"nowu\",\"emailAddress\":\"nowuseeme@xx.com\"}";    Admin admin = new Admin();    JsonReader reader = new JsonReader(new StringReader(json));    try {        reader.beginObject(); // throws IOException        while (reader.hasNext()) {            String s = reader.nextName();            switch (s) {                case "id":                    admin.setId(reader.nextInt());                    break;                case "name":                    admin.setName(reader.nextString()); //自动转换                    break;                case "emailAddress":                    admin.setEmailAddress( reader.nextString());                    break;            }        }        reader.endObject(); // throws IOException        System.out.println("id:"+admin.getId()+"  name:"+admin.getName()+"  emailAddress:"+admin.getEmailAddress());     } catch (IOException e) {        e.printStackTrace();    } }   

Gson的流式序列化

自动方式

这里写图片描述
由于PrintStreamWriter都实现了Appendable接口,即可

PrintStream printStream = System.out;gson.toJson(Bean, printStream);

稍微改下简单对象和json的转换案例:

@Testpublic void SimpleBeanAndJson(){    Admin admin = new Admin(1,"nowuseeme","nowuseeme@xx.com");     Gson gson = new Gson();     gson.toJson(admin,System.out);}//控制台打印结果:{"id":1,"name":"nowuseeme","emailAddress":"nowuseeme@xx.com"}

手动方式

测试:

@Testpublic void testJsonWriter(){    try {        JsonWriter writer = new JsonWriter(new OutputStreamWriter(System.out));        writer.beginObject() // throws IOException        .name("id").value("1")                .name("name").value("name")                .name("email").nullValue() //演示null                .endObject();        writer.flush(); // throws IOException    } catch (IOException e) {        e.printStackTrace();    }}

运行结果:

{"id":"1","name":"name","email":null}

GsonBuilder

作用

GsonBuilder是用于构建Gson实例的一个类,要想改变Gson默认的设置必须使用该类配置Gson。

Gson gson = new GsonBuilder()               //各种配置               .create(); //生成配置好的Gson

使用

使用GsonBuilder导出null值(Gson在默认情况下是不动导出值null的键的)、格式化输出、日期时间等

Gson gson = new GsonBuilder()        //序列化null        .serializeNulls()        // 设置日期时间格式,另有2个重载方法        // 在序列化和反序化时均生效        .setDateFormat("yyyy-MM-dd")        // 禁此序列化内部类        .disableInnerClassSerialization()        //生成不可执行的Json(多了 )]}' 这4个字符)        .generateNonExecutableJson()        //禁止转义html标签        .disableHtmlEscaping()        //格式化输出        .setPrettyPrinting()        .create();

TypeAdapter

TypeAdapter 是Gson自2.0(源码注释上说的是2.1)开始版本提供的一个抽象类,用于接管某种类型的序列化和反序列化过程,包含两个注要方法 write(JsonWriter,T)read(JsonReader) 其它的方法都是final方法并最终调用这两个抽象方法。
注:TypeAdapter 以及 JsonSerializerJsonDeserializer 都需要与 GsonBuilder.registerTypeAdapterGsonBuilder.registerTypeHierarchyAdapter配合使用

AdminTypeAdapter.java

import java.io.IOException;import com.google.gson.TypeAdapter;import com.google.gson.stream.JsonReader;import com.google.gson.stream.JsonWriter;public class AdminTypeAdapter extends TypeAdapter<Admin>{    @Override    public Admin read(JsonReader jsonreader) throws IOException {        Admin admin = new Admin();        jsonreader.beginObject();        while (jsonreader.hasNext()) {            switch (jsonreader.nextName()) {                    case "id":                        admin.setId(jsonreader.nextInt());                        break;                    case "name":                        admin.setName(jsonreader.nextString());                        break;                    case "emailAddress":                    case "email_address":                           case "email":                        admin.setEmailAddress(jsonreader.nextString());                        break;            }        }        jsonreader.endObject();        return admin;    }    @Override    public void write(JsonWriter jsonWriter, Admin admin) throws IOException {        jsonWriter.beginObject();        jsonWriter.name("id").value(admin.getId());        jsonWriter.name("name").value("管理员"+admin.getName());        jsonWriter.name("emailAddress").value(admin.getEmailAddress());        jsonWriter.endObject();         }}

测试:

@Testpublic void testTypeAdapter(){    Admin admin = new Admin(1,"nowuseeme","nowuseeme@xx.com");     Gson gson = new GsonBuilder().registerTypeAdapter(Admin.class, new AdminTypeAdapter()).create();    gson.toJson(admin, System.out);}

输出结果:

{"id":1,"name":"管理员nowuseeme","emailAddress":"nowuseeme@xx.com"}

JsonSerializer与JsonDeserializer

JsonSerializer

@Testpublic void testSerializer(){    Gson gson = new GsonBuilder().registerTypeAdapter(Admin.class, new JsonSerializer<Admin>(){        @Override        public JsonElement serialize(Admin admin, Type type,JsonSerializationContext arg2) {            final JsonObject jsonObject = new JsonObject();  //集合数组用JsonArray            jsonObject.addProperty("id", admin.getId());            jsonObject.addProperty("name", admin.getName());            jsonObject.addProperty("admin_email", admin.getEmailAddress());            return jsonObject;        }    }).create();    Admin admin = new Admin(1,"nowuseeme","nowuseeme@xx.com");     gson.toJson(admin, System.out);}

运行结果:

{"id":1,"name":"nowuseeme","admin_email":"nowuseeme@xx.com"}

JsonDeserializer

@Testpublic void testDeserializer(){    Gson gson = new GsonBuilder().registerTypeAdapter(Admin.class, new JsonDeserializer<Admin>() {        @Override        public Admin deserialize(JsonElement jsonelement, Type type,                JsonDeserializationContext jsondeserializationcontext)throws JsonParseException {            Admin admin = new Admin();            JsonObject jsonObject = jsonelement.getAsJsonObject();            admin.setId(jsonObject.get("id").getAsInt());            admin.setName(jsonObject.get("name").getAsString());            admin.setEmailAddress(jsonObject.get("emailAddress").getAsString()+"23333");            return admin;        }       }).create();    String json = "{\"id\":\"1\",\"name\":\"nowuseeme\",\"emailAddress\":\"nowuseeme@xx.com\"}";    Admin admin = gson.fromJson(json, Admin.class);    System.out.println(admin.getEmailAddress()); //nowuseeme@xx.com23333}

TypeAdapterFactory

@JsonAdapter注解

参考

http://www.jianshu.com/p/e740196225a4
http://www.jianshu.com/p/d62c2be60617
http://blog.csdn.net/chunqiuwei/article/details/49160321
http://blog.csdn.net/chunqiuwei/article/details/49401733
http://www.jianshu.com/p/fc5c9cdf3aab

0 0