gsongson入门


备注

Gson是一个开源Java库,可用于将Java对象转换为其JSON表示。它还可用于将JSON字符串转换为等效的Java对象。

Gson的目标

  • 提供易于使用的机制,如toString()和构造函数(工厂方法),将Java转换为JSON,反之亦然

  • 允许将预先存在的不可修改对象转换为JSON和从JSON转换

  • 允许对象的自定义表示

  • 支持任意复杂的对象

  • 生成紧凑且可读的JSON输出

Gson的源代码可以在Github上找到

用户指南

数组

JSON:

[
  {
    "id": 8484,
    "name": "David",
    "height": 173.2,
    "weight": 75.42
  },
  {
    "id": 8485,
    "name": "Ronald",
    "height": 183.73,
    "weight": 83.1
  }
]
 

Person.java

public class Person {
    public int id;
    public String name;
    public double height;
    public double weight;

    @Override
    public String toString() {
        return "[ id: " + String.valueOf(id) + ", name: " + name + ", height: " + String.valueOf(height) + ", weight: " + String.valueOf(weight) + " ]";
    }
}
 

用法:

Gson gson = new Gson();
Person[] persons = gson.fromJson(json, Person[].class);
for(Person person : persons)
    System.out.println(person.toString());
 

输出:

[ id: 8484, name: David, height: 173.2, weight: 75.42 ]
[ id: 8485, name: Ronald, height: 183.73, weight: 83.1 ]
 

不使用POJO将String转换为JsonObject

String jsonStr = "{\"name\" : \"Abcd\", \"greeting\": \"Hello\", }"; //Sample Json String

Gson gson = new Gson(); // Creates new instance of Gson
JsonElement element = gson.fromJson (jsonStr, JsonElement.class); //Converts the json string to JsonElement without POJO 
JsonObject jsonObj = element.getAsJsonObject(); //Converting JsonElement to JsonObject

String name = jsonObj.get("name").getAsString(); //To fetch the values from json object
String greeting = jsonObj.get("greeting").getAsString();
 

安装

要使用Gson,您必须将其包含在项目中。您可以通过添加Maven Central中可用的Gson版本的以下依赖项来完成此操作:

Maven的

添加到pom.xml

<dependencies>
    <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.8.0</version>
      <scope>compile</scope>
    </dependency>
</dependencies>
 

Gradle

添加到build.gradle

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

序列化和反序列化

Gson gson = new Gson(); //Create a Gson object
MyType target = new MyType(); //This is the object you want to convert to JSON   
String json = gson.toJson(target); // serializes target to Json
MyType target2 = gson.fromJson(json, MyType.class); // deserializes json into target2
 

简单的例子

Gson库提供了Gson.class ,它处理Java和JSON对象之间的所有转换。可以通过调用默认构造函数来创建此类的实例。您通常希望在程序的大部分操作中都有一个Gson实例。

Gson gson = new Gson();
 

首先,我们需要创建我们将要使用的对象的类

class Person {
   public String name;
   public int age;

   public Person(String name, int age){
       this.name = name;
       this.age = age;
   }
}
 

Gson类提供了toJsonfromJson 方法,它们是JSON和java对象的主要入口点

让我们尝试将java对象转换为JSON并返回到java对象

Person person = new Person("Jason", 29);
//using gson object which we created earlier
String json = gson.toJson(person);
System.out.println(json);
//Outputs: {"name": "Jason", "age": 29}
 

现在回来了

String json = "{\"name\": \"Jason\", \"age\": 29}";
Person person = gson.fromJson(json, Person.class);
System.out.println(person.age + "yo " + person.name + " walks into a bar");
//Outputs "29 yo Jason walks into a bar"
 

使用带继承的GSON

GSON不支持继承我们的框。假设我们有以下类层次结构:

public class BaseClass {
    int a;
 
    public int getInt() {
        return a;
   }
}
 
public class DerivedClass1 extends BaseClass {
     int b;
 
     @Override
     public int getInt() {
         return b;
     }
 }
 
public class DerivedClass2 extends BaseClass {
    int c;
 
    @Override
    public int getInt() {
        return c;
    }
}
 

现在我们要将DerivedClass1 的实例序列化为json字符串

DerivedClass1 derivedClass1 = new DerivedClass1();
derivedClass1.b = 5;
derivedClass1.a = 10;
 
Gson gson = new Gson();
String derivedClass1Json = gson.toJson(derivedClass1);
 

现在,在另一个地方,我们收到这个json字符串并想要反序列化它 - 但在编译时我们只知道它应该是BaseClass 一个实例:

BaseClass maybeDerivedClass1 = gson.fromJson(derivedClass1Json, BaseClass.class);
System.out.println(maybeDerivedClass1.getInt());
 

但GSON不知道derivedClass1Json 原本的实例DerivedClass1 ,所以这会打印出10。

怎么解决这个?

您需要构建自己的JsonDeserializer ,以处理此类情况。解决方案不是很干净,但我无法想出更好的解决方案。

首先,将以下字段添加到基类

@SerializedName("type")
private String typeName;
 

并在基类构造函数中初始化它

public BaseClass() {
    typeName = getClass().getName();
}
 

现在添加以下类:

public class JsonDeserializerWithInheritance<T> implements JsonDeserializer<T> {
 
 @Override
 public T deserialize(
     JsonElement json, Type typeOfT, JsonDeserializationContext context)
     throws JsonParseException {
     JsonObject jsonObject = json.getAsJsonObject();
     JsonPrimitive classNamePrimitive = (JsonPrimitive) jsonObject.get("type");
 
     String className = classNamePrimitive.getAsString();
 
     Class<?> clazz;
     try {
     clazz = Class.forName(className);
     } catch (ClassNotFoundException e) {
     throw new JsonParseException(e.getMessage());
     }
     return context.deserialize(jsonObject, clazz);
 }
}
 

剩下要做的就是搞定一切 -

GsonBuilder builder = new GsonBuilder();
 builder
 .registerTypeAdapter(BaseClass.class, new JsonDeserializerWithInheritance<BaseClass>());
 Gson gson = builder.create();
 

现在,运行以下代码 -

 DerivedClass1 derivedClass1 = new DerivedClass1();
 derivedClass1.b = 5;
 derivedClass1.a = 10;
 String derivedClass1Json = gson.toJson(derivedClass1);
 
 BaseClass maybeDerivedClass1 = gson.fromJson(derivedClass1Json, BaseClass.class);
 System.out.println(maybeDerivedClass1.getInt());
 

将打印5。