天天看點

Springboot JSON整合—官方原版

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);
        }

    }

}

           
Springboot JSON整合—官方原版

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 多克