Spring Boot 提供與三個 JSON 映射庫的內建:
- Gson
- Jackson
- JSON-B
Jackson是首選和預設庫。
一、Jackson
提供了Jackson的自動配置,Jackson是spring boot starter json的一部分。當Jackson在類路徑上時,會自動配置一個ObjectMapperbean。提供了幾個配置财産,用于自定義ObjectMapper的配置。
1.1 自定義序列化程式和反序列化程式
如果您使用Jackson來序列化和反序列化JSON資料,您可能需要編寫自己的JsonSerializer和JsonDeserializer類。自定義序列化程式通常通過一個子產品向Jackson注冊,但Spring Boot提供了一個替代的@JsonComponent注釋,可以更容易地直接注冊Spring Beans。
您可以在JsonSerializer、JsonDeserializer或KeyDeserialize實作上直接使用@JsonComponent注釋。您也可以在包含序列化程式/反序列化程式作為内部類的類上使用它,如以下示例所示:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.x.x</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.x.x</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.x.x</version>
</dependency>
import java.io.IOException;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.ObjectCodec;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import org.springframework.boot.jackson.JsonComponent;
@JsonComponent
public class MyJsonComponent {
public static class Serializer extends JsonSerializer<MyObject> {
@Override
public void serialize(MyObject value, JsonGenerator jgen, SerializerProvider serializers) throws IOException {
jgen.writeStartObject();
jgen.writeStringField("name", value.getName());
jgen.writeNumberField("age", value.getAge());
jgen.writeEndObject();
}
}
public static class Deserializer extends JsonDeserializer<MyObject> {
@Override
public MyObject deserialize(JsonParser jsonParser, DeserializationContext ctxt) throws IOException {
ObjectCodec codec = jsonParser.getCodec();
JsonNode tree = codec.readTree(jsonParser);
String name = tree.get("name").textValue();
int age = tree.get("age").intValue();
return new MyObject(name, age);
}
}
}
ApplicationContext中的所有@JsonComponent bean都會自動向Jackson注冊。因為@JsonComponent是用@Component進行元注釋的,是以應用通常的元件掃描規則。
Spring Boot還提供了JsonObjectSerializer和JsonObjectDeserializer基類,它們在序列化對象時為标準Jackson版本提供了有用的替代方案。有關詳細資訊,請參閱Javadoc中的JsonObjectSerializer和JsonObjectDeserializer。
上面的例子可以重寫為使用JsonObjectSerializer/JsonObjectDeserializer,如下所示:
import java.io.IOException;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.ObjectCodec;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.SerializerProvider;
import org.springframework.boot.jackson.JsonComponent;
import org.springframework.boot.jackson.JsonObjectDeserializer;
import org.springframework.boot.jackson.JsonObjectSerializer;
@JsonComponent
public class MyJsonComponent {
public static class Serializer extends JsonObjectSerializer<MyObject> {
@Override
protected void serializeObject(MyObject value, JsonGenerator jgen, SerializerProvider provider)
throws IOException {
jgen.writeStringField("name", value.getName());
jgen.writeNumberField("age", value.getAge());
}
}
public static class Deserializer extends JsonObjectDeserializer<MyObject> {
@Override
protected MyObject deserializeObject(JsonParser jsonParser, DeserializationContext context, ObjectCodec codec,
JsonNode tree) throws IOException {
String name = nullSafeValue(tree.get("name"), String.class);
int age = nullSafeValue(tree.get("age"), Integer.class);
return new MyObject(name, age);
}
}
}
1.2混合
Jackson支援mixin,它可以用來将額外的注釋混合到目标類上已經聲明的注釋中。Spring Boot的Jackson自動配置将掃描應用程式包中用@JsonMixin注釋的類,并将它們注冊到自動配置的ObjectMapper中。注冊由Spring Boot的JsonMixinModule執行。
代碼示例
@Data
@AllArgsConstructor
public class Book{
private String name;
private Integer price;
}
@JsonMixin(Book.class) //Spring Boot的Jackson自動配置将掃描應用程式的包以查找帶有"@JsonMixin"注釋的類,并将它們注冊到自動配置的"ObjectMapper"。 注冊動作由Spring Boot的"JsonMixinModule"執行。"Person.class"是被附加mixin的目标類
public abstract class FullNameMixin {
@JsonProperty("fullName") //被定制的新名稱
String name; //被定制的原屬性
}
二、Gson
提供了Gson的自動配置。當Gson在類路徑上時,會自動配置Gson bean。提供了幾個spring.gson.*配置财産來定制配置。為了獲得更多的控制權,可以使用一個或多個GsonBuilderCustomizer bean。
1、開發執行個體
引入依賴
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
示例:
// 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 i = gson.fromJson("1", int.class);
Integer intObj = gson.fromJson("1", Integer.class);
Long longObj = gson.fromJson("1", Long.class);
Boolean boolObj = gson.fromJson("false", Boolean.class);
String str = gson.fromJson("\"abc\"", String.class);
String[] strArray = gson.fromJson("[\"abc\"]", String[].class);
對象示例
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"}
Array示例
Gson gson = new Gson();
int[] ints = {1, 2, 3, 4, 5};
String[] strings = {"abc", "def", "ghi"};
// Serialization
gson.toJson(ints); // ==> [1,2,3,4,5]
gson.toJson(strings); // ==> ["abc", "def", "ghi"]
// Deserialization
int[] ints2 = gson.fromJson("[1,2,3,4,5]", int[].class);
// ==> ints2 will be same as ints
三、JSON-B
提供了JSON-B的自動配置。當JSON-B API和一個實作在類路徑上時,Jsonb bean将被自動配置。首選的JSON-B實作是Eclipse Yasson,它提供了依賴關系管理。
大家好,我們是Doker品牌,歡迎點贊和評論,您的鼓勵是我們持續更新的動力!更多資料請前往Doker 多克