1. 程式人生 > >springboot返回json的格式化問題

springboot返回json的格式化問題

在實際開發過程中,介面的定義和規範,嚴格意義上會細化到,空字串應該返回null還是"",亦或是"null",空陣列應該返回null還是[],包括是不是要返回value為null的欄位。但是springboot預設使用的是Jackson json轉換器。Jackson在設定json的格式化問題時雖然可以通過手動重寫方法實現,但是不夠靈活。因而可以使用阿里的fastjson實現格式的靈活配置,下面介紹兩種的具體實現:

一、通過fastjson實現

在Application類下面新增如下程式碼,將預設的json轉換工具替換為fastjson。其中SerializerFeature裡面有很多可自行設定的返回樣式,可以自行度狗瞭解。

/**
     * 替換框架json為 FastJson返回
     * 
     * @param
     */
    @Bean
    public HttpMessageConverters configureMessageConverters() {
        // 1.構建了一個HttpMessageConverter FastJson訊息轉換器
        FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
        // 2.定義一個配置,設定編碼方式,和格式化的形式
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        // 3.設定PrettyFormat格式化,設定空字元,空集合返回空陣列[]等
        fastJsonConfig.setSerializerFeatures(
                // 是否格式化返回Json
                SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullListAsEmpty, SerializerFeature.WriteNullNumberAsZero, SerializerFeature.WriteNullStringAsEmpty);
        // 4.處理中文亂碼問題
        List<MediaType> fastMediaTypes = new ArrayList<>();
        fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
        fastConverter.setSupportedMediaTypes(fastMediaTypes);

        // 5.將fastJsonConfig加到訊息轉換器中
        fastConverter.setFastJsonConfig(fastJsonConfig);
        return new HttpMessageConverters(fastConverter);
    }

二、通過使用JacksonObjectMapper,實現自己的SerializerModifier實現

在Application類下面新增如下程式碼:

/**
     * 預設返回空json字串,陣列序列化為[]
     *
     * @param builder
     * @return
     */
    @Bean
    @Primary
    @ConditionalOnMissingBean(ObjectMapper.class)
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        // 為mapper註冊一個帶有SerializerModifier的Factory,此modifier主要做的事情為:當序列化型別為array,list、set時,當值為空時,序列化成[]
        objectMapper.setSerializerFactory(objectMapper.getSerializerFactory().withSerializerModifier(new SerializerModifier()));
        // 空值處理為空串
        objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
            @Override
            public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
                jsonGenerator.writeString("");
            }
        });

        return objectMapper;
    }

實現自己的SerializerModifier:

package com.walletServer.config;

import java.util.List;
import java.util.Set;
 
import com.fasterxml.jackson.databind.BeanDescription;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializationConfig;
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;
 
public class SerializerModifier extends BeanSerializerModifier {
 
    private JsonSerializer<Object> _nullArrayJsonSerializer = new ArrayJsonSerializer();
 
    @Override
    public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BeanDescription beanDesc,
            List<BeanPropertyWriter> beanProperties) {
        // 迴圈所有的beanPropertyWriter
        for (int i = 0; i < beanProperties.size(); i++) {
            BeanPropertyWriter writer = beanProperties.get(i);
            // 判斷欄位的型別,如果是array,list,set則註冊nullSerializer
            if (isArrayType(writer)) {
                 //給writer註冊一個自己的nullSerializer
                writer.assignNullSerializer(this.defaultNullArrayJsonSerializer());
            }
        }
        return beanProperties;
    }
 
    // 判斷是什麼型別
    protected boolean isArrayType(BeanPropertyWriter writer) {
        Class<?> clazz = writer.getPropertyType();
        return clazz.isArray() || clazz.equals(List.class) || clazz.equals(Set.class);
 
    }
 
    protected JsonSerializer<Object> defaultNullArrayJsonSerializer() {
        return _nullArrayJsonSerializer;
    }
}
package com.walletServer.config;

import java.io.IOException;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

public class ArrayJsonSerializer extends JsonSerializer<Object> {

    @Override
    public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
        if (value == null) {
            jgen.writeStartArray();
            jgen.writeEndArray();
        } else {
            jgen.writeObject(value);
        }
    }
}

相關推薦

springboot返回json格式化問題

在實際開發過程中,介面的定義和規範,嚴格意義上會細化到,空字串應該返回null還是"",亦或是"null",空陣列應該返回null還是[],包括是不是要返回value為null的欄位。但是springboot預設使用的是Jackson json轉換器。Jackson在設定js

springboot 返回json字符串格式化問題

返回 -o 註解 message jackson 2.0.8 2.0 ssa serializa 在idea中yml文件中添加以下註解就可以格式化json字符串效果 spring: jackson: serialization: indent-outpu

SpringBoot 返回json 字符串(jackson 及 fast json

json數據 serialize fastjson serial app style sage cti 字符串 一、jackson 1、Controller [email protected]/* */ [email protected]/* */

springboot返回json

line vat public 我們 div pre 字符 json解析 name 1.新建Demo類: public class Demo { private int id; private String name; public int ge

SpringBoot 返回Json實體類屬性大小寫問題

  問題: 如果前端使用的引數是大寫的而不是標準的駝峰式寫法,那麼後臺在進行引數的互動的時候會出現引數接收不到的問題 如:前端使用 Title 而後端實體類中式title 這樣是不統一的;   解決:兩種方式 Jackjson 和 Fastjson

3、SpringBoot 返回JSON資料格式

SpringBoot 返回 JSON 資料格式 github原始碼 方式一:使用自帶的 jackson 將 Controller 層的 @Controller 註解替換成 @RestController 即可 方式二:完美使用 FastJson pom 引入依賴:

springboot 返回json格式資料時間格式配置

mybatis資料查詢返回的時間,是一串數字,如何轉化成時間。兩種方法,推薦第一種方法一:可以在apllication.property加入下面配置就可以#時間戳統一轉換spring.jackson.date-format=yyyy-MM-dd HH:mm:ssspring.

SpringBoot | 返回Json實體類屬性大小寫問題

his 駝峰 font property ride java jsonp lena () 今天遇到一個很有意思的問題,寫個微博記錄一下。前端朋友要我傳一個大寫屬性(類似於PEOPLEName)的json實體給他,可是就算把變量名寫成這樣,他收到的還是(peop

SpringBoot 02_返回json數據

back html npe 後端 定義 private clas code logs 在SpringBoot 01_HelloWorld的基礎上來返回json的數據,現在前後端分離的情況下多數都是通過Json來進行交互,下面就來利用SpringBoot返回Json格式的數據

SpringBoot Jack Json 返回前端時間少一天的問題

前倆天在專案中遇到一個問題,時間在資料庫是正常的 但是返回前端的時候卻少了一天;查詢了一下是JackJson 的問題 那麼如何解決這個問題呢? 我們只需要在。yml中對jackjson 進行配置就好 jackson: serialization: #格式化輸出

mvc 返回json格式時間格式化

protected override JsonResult Json(object data, string contentType, System.Text.Encoding contentEncoding, JsonRequestBehavior behavior) {

SpringBoot自定義404、500返回JSON資料

現有的方法,編寫全域性的異常處理,需要在SpringBoot配置檔案中配置沒有找到Controller時丟擲異常,並且將靜態資源對映關閉。因為預設是不丟擲異常的,是去找錯誤頁面,所以還需要關閉靜態資源對

Spring Boot | 返回Json資料中的Date格式化

                    --昨夜西風凋碧樹,獨上高樓,望盡天涯路   採用Spring Boot加Mybatis時,Mybatis中時間格式為datetime型別,Java中實體類型別為Date型別: 當通過Spring Boot自

SpringBoot+Jpa 在MySql中自動生成時間和返回json格式資料時間格式配置

先說資料時間格式的設定 有兩種 一種是:可以在apllication.property加入下面配置就可以 #時間戳統一轉換 spring.jackson.date-format=yyyy-MM-dd HH:mm:ss spring.jackson.time-zone=

SpringBoot返回date日期格式化,解決返回為TIMESTAMP時間戳格式或8小時時間差(轉載)

@JSONField(format = "yyyy-MM-dd HH:mm:ss")  //FastJson包使用註解     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") //Jack

springboot整合springdataJPA 2.1.0 返回json資料異常

提示資訊如下 com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddy

返回json資料,格式化日期型別去掉時分秒

private Date xxx; 返回json資料,預設帶著時分秒00:00:00,去掉時分秒使用註解@JsonFiled 1需要引fastjson包 <!-- https://mvnrepo

springboot處理統一返回json資料格式

第一步,寫一個實體類JsonResultEntity,定義返回的引數 package com.bujiang.magic.common.utils; public class JsonResultEntity { private Object data; private String

Java bean物件返回資料Json格式化

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "##0.00") //精度保留2位小數 @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-

SpringBoot返回json數據

class tro load span ava host nbsp get arr 一、創建一個springBoot個項目 二、編寫實體類 /** * 返回Json數據實體類 */ public class User { private int