溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何使用Jackson處理null或者空字符串

發(fā)布時(shí)間:2021-08-19 11:17:24 來源:億速云 閱讀:3127 作者:chen 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“如何使用Jackson處理null或者空字符串”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

目錄
  • Jackson 處理 null 或者 空字符串

    • 這里要區(qū)分序列化和反序列化

    • 如果是字段屬性級(jí)別的

  • jackson解決:null到"", 空值處理為空串

    • 1.一個(gè)比較頭疼的問題

    • 2.代碼如下

    • 3.配置如下

Jackson 處理 null 或者 空字符串

Retrofit 配合 Jackson 反序列化,就是將字符串解析為java bean 對(duì)象 的時(shí)候 ,如果遇到服務(wù)端由于各種原因會(huì)導(dǎo)致 有些String類型的字段值為null ,需要替換為空字符串或者占位符“-”什么的,并且不確定 到底會(huì)在哪個(gè)字段,可以如下處理

這里要區(qū)分序列化和反序列化

序列化,就是處理java bean對(duì)象轉(zhuǎn)換為字符串,通常設(shè)置

objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

這樣在java bean中對(duì)象有值為null ,就不會(huì)將這個(gè)字段或?qū)傩孕蛄谢癁樽址?/p>

或者在java bean 模型定義中注解,表明不將其序列化

@JsonInclude(JsonInclude.Include.NON_NULL)

反序列化,就是將服務(wù)器端返回的json串轉(zhuǎn)換為java 對(duì)象,通常在處理null值, 將某些值更改為指定格式也類似。可以如下操作

在使用jackson 的時(shí)候,通常會(huì)通過 compile ‘com.squareup.retrofit2:converter-jackson:2.3.0'集成 官方的 JacksonConverterFactory ,其實(shí)它除了自動(dòng)引入jackson外,另外引入了三個(gè)類,可以拷貝出來,方便修改引用,其中只需要更改 JacksonConverterFactory.java 中的create函數(shù)即可。針對(duì)反序列化過程中String類型處理,添加自定義反序列化器。

public static JacksonConverterFactory create() {
        ObjectMapper objectMapper = new ObjectMapper();
        SimpleModule module = new SimpleModule();
        module.addDeserializer(String.class, new CustomStringDeserializer());
        objectMapper.registerModule(module);
        return create(objectMapper);
    }

其中 CustomStringDeserializer.java 如下 ,重要的就是 getNullValue()的覆寫,它決定了如果 反序列化json串中有一個(gè)字段的值是 null, 處理策略,這里是默認(rèn)返回“-”。

public class CustomStringDeserializer extends JsonDeserializer<String> {
    @Override
    public String deserialize(JsonParser jsonparser,
                              DeserializationContext deserializationcontext) throws IOException,
            JsonProcessingException {
        return jsonparser.getText();
    }
    @Override
    public String getNullValue() {
        return "-";
    }
}

這是全局處理情況,如果是類級(jí)別的,需要在類上加反序列器,但要處理的就不只是String了,類中所有字段你都需要處理,因?yàn)檫@時(shí),返回的是一個(gè)類,

public class CustomClassDeserializer extends JsonDeserializer<T> {
    @Override
    public T deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        return null;
    }
}

然后在類的bean上使用注解,表明該類用這個(gè)反序列化器來處理

@JsonDeserialize(using = CustomClassDeserializer.class)
class yourClass()

如果是字段屬性級(jí)別的

需要在相應(yīng)的字段屬性上這樣使用

@JsonDeserialize(using = CustomStringDeserializer.class)
private String name;

還有一種情形是反序列化的時(shí)候如果字段是形如“”的空字符串,想轉(zhuǎn)換成null,那就不需要覆寫 getNullValue() ,直接在deserialize中處理就好。

jackson解決:null到"", 空值處理為空串

1.一個(gè)比較頭疼的問題

jackson + spring 支持rest接口,輸出的JSON 對(duì)于null的字符串是invoiceTitle: null,但是接受方希望返回的是invoiceTitle: ""。解決方法重寫ObjectMapper

2.代碼如下

public class MyJsonMapper extends ObjectMapper{
  public MyJsonMapper(){
    super();
    this.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {  
      @Override  
      public void serialize(Object value, JsonGenerator jg, SerializerProvider sp) throws IOException, JsonProcessingException {  
          jg.writeString("");  
      }  
    }); 
  }
}

3.配置如下

<bean id="jacksonMapper" class="com.tyky.eduplat.reslib.infrastructure.MyJsonMapper">
<property name="dateFormat">
<bean class="java.text.SimpleDateFormat">
<constructor-arg value="yyyy-MM-dd HH:mm:ss"/>
</bean>
</property>
</bean> 
<bean id="jacksonProvider" class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider">
<constructor-arg ref="jacksonMapper" />
</bean>

“如何使用Jackson處理null或者空字符串”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI