java解析json(四):gson

定义

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

JAR包

gson-2.2.4.jar

主要API

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

Gson的基本用法

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

@Test
public 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
}

测试:

@Test
public 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类来手动实现反序列化

@Test
public 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的转换案例:

@Test
public 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"}

手动方式

测试:

@Test
public 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();     
    }
}

测试:

@Test
public 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

@Test
public 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

@Test
public 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值