Gson

简介

一个Java库,用于Java对象和JSON对相互转换。

项目地址

https://github.com/google/gson

API

http://www.javadoc.io/doc/com.google.code.gson/gson/2.8.0

User Guide

https://github.com/google/gson/blob/master/UserGuide.md

gradle配置

compile 'com.google.code.gson:gson:2.8.0'

基本用法

序列化json

gson.toJson()

反序列化json

gson.fromJson()

例子1:

// Serialization
Gson gson = new Gson();
gson.toJson(1);            // ==> 1
gson.toJson("abcd");       // ==> "abcd"
gson.toJson(new Long(10)); // ==> 10
int[] values = { 1 };
gson.toJson(values);       // ==> [1]

// Deserialization
int one = gson.fromJson("1", int.class);
Integer one = gson.fromJson("1", Integer.class);
Long one = gson.fromJson("1", Long.class);
Boolean false = gson.fromJson("false", Boolean.class);
String str = gson.fromJson("\"abc\"", String.class);
String[] anotherStr = gson.fromJson("[\"abc\"]", String[].class);

例子2:

class BagOfPrimitives {
  private int value1 = 1;
  private String value2 = "abc";
  private transient int value3 = 3;
  BagOfPrimitives() {
    // no-args constructor
  }
}

// Serialization
BagOfPrimitives obj = new BagOfPrimitives();
Gson gson = new Gson();
String json = gson.toJson(obj);  

// ==> json is {"value1":1,"value2":"abc"}

gsonBuilder设置

        GsonBuilder gsonBuilder = new GsonBuilder();
        /**
         * 设置在序列化时忽略null元素
         */
        gsonBuilder.serializeNulls();

        /**
         * 设置不对序列化内部类,内部类
         */
        gsonBuilder.disableInnerClassSerialization();
        /**
         * 设置高于版本号,配合@Since
         */
        gsonBuilder.setVersion(3);
        /**
         *
         */
        gsonBuilder.excludeFieldsWithModifiers(Modifier.STATIC);
        /**
         * 设置格式化打印
         */
        gsonBuilder.setPrettyPrinting();
        /**
         * 禁止html转码
         */
        gsonBuilder.disableHtmlEscaping();

自定义适配器

MyClass.java

public class MyClass {
    private int m_int;
    private String m_string;


    public int getM_int() {
        return m_int;
    }

    public void setM_int(int m_int) {
        this.m_int = m_int;
    }

    public String getM_string() {
        return m_string;
    }

    public void setM_string(String m_string) {
        this.m_string = m_string;
    }
}

使用TypeAdapter序列化和反序列化

public class MyTypeAdapter extends TypeAdapter<MyClass> {

    @Override
    public void write(JsonWriter out, MyClass value) throws IOException {
        if (value == null) {
            out.nullValue();
            return;
        }
        out.beginObject();
        out.name("myclass_int");
        out.value(value.getM_int());
        out.name("myclass_string");
        out.value(value.getM_string());
        out.endObject();
    }

    @Override
    public MyClass read(JsonReader in) throws IOException {
        if (in.peek() == JsonToken.NULL) {
            in.nextNull();
            return null;
        }
        in.beginObject();
        MyClass myClass = new MyClass();
        while (in.peek() != JsonToken.END_OBJECT) {
            String name = in.nextName();
            if(name.equals("myclass_int")){
                int value = in.nextInt();
                myClass.setM_int(value);
            }else if(name.equals("myclass_string")){
                String string = in.nextString();
                myClass.setM_string(string);
            }
        }
        in.endObject();
        return myClass;
    }

}

使用JsonSerializer和JsonDeserializer序列化和反序列化

public class MyJsonSerializerAndJsonDeserializer implements JsonSerializer<MyClass>,JsonDeserializer<MyClass>{

    @Override
    public MyClass deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        /**
         * 反序列化
         */
        MyClass myClass = new MyClass();
        int myclass_int = json.getAsJsonObject().get("myclass_int").getAsJsonPrimitive().getAsInt();
        String myclass_string = json.getAsJsonObject().get("myclass_string").getAsString();
        myClass.setM_int(myclass_int);
        myClass.setM_string(myclass_string);
        return myClass;
    }

    @Override
    public JsonElement serialize(MyClass src, Type typeOfSrc, JsonSerializationContext context) {
        /**
         *序列化
         */
        JsonObject jsonObject = new JsonObject();
        jsonObject.addProperty("myclass_int",src.getM_int());
        jsonObject.addProperty("myclass_string",src.getM_string());
        return jsonObject;
    }
}

使用以上适配器

        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.registerTypeAdapter(MyClass.class,new MyTypeAdapter());
        gsonBuilder.registerTypeAdapter(MyClass.class,new MyJsonSerializerAndJsonDeserializer());
        Gson gson = gsonBuilder.create();

        MyClass myClass = new MyClass();
        myClass.setM_int(3);
        myClass.setM_string("我是陆大旭");
        String string = gson.toJson(myClass);

        String string2 = "{\"myclass_int\":3,\"myclass_string\":\"我是陆大旭\"}";
        MyClass myClass1 = gson.fromJson(string2,MyClass.class);

其他知识点

1.不能序列化循环应用的对象,这样会导致无限递归。 比如:

class BagOfPrimitives {

    private BagOfPrimitives bagOfPrimitives = new BagOfPrimitives();

    BagOfPrimitives() {
        // no-args constructor
    }
}

//无限递归,报错
gson.toJson(new BagOfPrimitives());

2.FieldNamingPolicy参数 IDENTITY:默认,不改变变量名字 UPPER_CAMEL_CASE:首字母变大

  • someFieldName ---> SomeFieldName
  • _someFieldName ---> _SomeFieldName
UPPER_CAMEL_CASE_WITH_SPACES:用空格间隔
  • someFieldName ---> Some Field Name
  • _someFieldName ---> _Some Field Name
LOWER_CASE_WITH_UNDERSCORES:用下划线间隔
  • someFieldName ---> some_field_name
  • _someFieldName ---> _some_field_name
  • aStringField ---> a_string_field
  • aURL ---> a_u_r_l
LOWER_CASE_WITH_DASHES:用点线间隔
  • someFieldName ---> some-field-name
  • _someFieldName ---> _some-field-name
  • aStringField ---> a-string-field
  • aURL ---> a-u-r-l

results matching ""

    No results matching ""