spring框架返回json數據null轉空字符串


 

spring項目中,前端獲取服務器返回的json時,里面有null值,如果沒做校驗,就會導致js報錯,但是不推薦每個返回的地方手動處理,而是應該在框架中統一配置。

前面關於json日期格式化的文章中,提到了spring默認使用的是jackson來做json序列化,相對應的converter是MappingJackson2HttpMessageConverter,我們依舊還是要利用它提供的ObjectMapper來解決上面的問題。

方法一:

1、繼承ObjectMapper,自定義mapper

 

package com.ssm.common;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;
import java.text.SimpleDateFormat;

/**
 * SpringMVC中@ResponseBody返回json時,默認使用jackson,但是不會自動將null轉成空字符串,
 * 所以這里繼承ObjectMapper重寫構造方法,在構造方法中進行手動處理
 * Created by SongFei on 2016/12/26.
 */
public class JsonMapper extends ObjectMapper {

    public JsonMapper() {

        super();

        // null值轉空字符串
        this.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
            @Override
            public void serialize(Object value, JsonGenerator generator, SerializerProvider provider) throws IOException {
                generator.writeString("");
            }
        });

        // 不返回時間戳格式
        this.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        // 遇到不認識的字段,不拋異常
        this.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        // 指定自己想要的日期格式,如:yyyy-MM-dd HH:mm:ss
        this.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

    }

}

2、在配置文件中的<mvc:annotation-driven/>標簽中對messageconverter做特殊處理,引入自定義的ObjectMapper

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="supportedMediaTypes">
                <list>
                    <value>application/json;charset=UTF-8</value>
                    <value>text/json;charset=UTF-8</value>
                </list>
            </property>
            <!--引入自定義的ObjectMapper-->
            <property name="objectMapper">
                <bean class="com.ssm.common.JsonMapper"/>
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

上述兩個步驟確認無誤之后,應該瀏覽器返回就會把null轉為"", (但是經過測試,如果在控制台打印,還會是null,因為還沒有運行到view層呢!)

 

方法二: 

1、將接口返回的字段為null的設置為空字符串:

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
import java.io.IOException;
 
@Configuration
public class CustomConfig {
 
    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
            @Override
            public void serialize(Object paramT, JsonGenerator paramJsonGenerator,
                                  SerializerProvider paramSerializerProvider) throws IOException {
                //設置返回null轉為 空字符串""
                paramJsonGenerator.writeString("");
            }
        });
        return objectMapper;
    }
 
}

2、設置null字段不返回給前端:

//1.實體上
 
@JsonInclude(Include.NON_NULL) 
 
//將該標記放在屬性上,如果該屬性為NULL則不參與序列化 
//如果放在類上邊,那對這個類的全部屬性起作用 
//Include.Include.ALWAYS 默認 
//Include.NON_DEFAULT 屬性為默認值不序列化 
//Include.NON_EMPTY 屬性為 空(“”) 或者為 NULL 都不序列化 
//Include.NON_NULL 屬性為NULL 不序列化 
 
//2.代碼上
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(Include.NON_NULL);  
 
//通過該方法對mapper對象進行設置,所有序列化的對象都將按改規則進行系列化 
//Include.Include.ALWAYS 默認 
//Include.NON_DEFAULT 屬性為默認值不序列化 
//Include.NON_EMPTY 屬性為 空(“”) 或者為 NULL 都不序列化 
//Include.NON_NULL 屬性為NULL 不序列化

 

 

 

如果是springboot項目,就更簡單了,直接在config類中對ObjectMapper操作,都不用自己重新寫:

@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
    MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
    List<MediaType> supported = new ArrayList<>();
    supported.add(MediaType.APPLICATION_JSON_UTF8);
    mappingJackson2HttpMessageConverter.setSupportedMediaTypes(supported);

    // JsonMapper
    ObjectMapper objectMapper = new ObjectMapper();

    // null值的處理,必須要放在第一步,否則會將下面的日期格式化覆蓋掉
    // null ==> ""
    objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
        @Override
        public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
            gen.writeString("");
        }
    });

    // 處理默認日期格式化:yyyy-MM-dd HH:mm:ss
    objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    objectMapper.setDateFormat(new SimpleDateFormat(Constants.TIME_PATTERN));
    
    mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper);
    return mappingJackson2HttpMessageConverter;
}

 

 

 同樣原理,對時間轉換進行操作: https://www.cnblogs.com/fps2tao/p/13528671.html

 

 

轉 : https://www.jiweichengzhu.com/article/225600001e034f2691345ac14673b108

 

轉: https://blog.csdn.net/qq_40741855/article/details/106095808

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM