使用Jackson 處理 null 或者 空字符串
Jackson 處理 null 或者 空字符串
Retrofit 配合 Jackson 反序列化,就是將字符串解析為java bean 對象 的時候 ,如果遇到服務(wù)端由于各種原因會導致 有些String類型的字段值為null ,需要替換為空字符串或者占位符“-”什么的,并且不確定 到底會在哪個字段,可以如下處理
這里要區(qū)分序列化和反序列化
序列化,就是處理java bean對象轉(zhuǎn)換為字符串,通常設(shè)置
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
這樣在java bean中對象有值為null ,就不會將這個字段或?qū)傩孕蛄谢癁樽址?/p>
或者在java bean 模型定義中注解,表明不將其序列化
@JsonInclude(JsonInclude.Include.NON_NULL)
反序列化,就是將服務(wù)器端返回的json串轉(zhuǎn)換為java 對象,通常在處理null值, 將某些值更改為指定格式也類似??梢匀缦虏僮?/p>
在使用jackson 的時候,通常會通過 compile ‘com.squareup.retrofit2:converter-jackson:2.3.0'集成 官方的 JacksonConverterFactory ,其實它除了自動引入jackson外,另外引入了三個類,可以拷貝出來,方便修改引用,其中只需要更改 JacksonConverterFactory.java 中的create函數(shù)即可。針對反序列化過程中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串中有一個字段的值是 null, 處理策略,這里是默認返回“-”。
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 "-";
}
}
這是全局處理情況,如果是類級別的,需要在類上加反序列器,但要處理的就不只是String了,類中所有字段你都需要處理,因為這時,返回的是一個類,
public class CustomClassDeserializer extends JsonDeserializer<T> {
@Override
public T deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
return null;
}
}
然后在類的bean上使用注解,表明該類用這個反序列化器來處理
@JsonDeserialize(using = CustomClassDeserializer.class) class yourClass()
如果是字段屬性級別的
需要在相應(yīng)的字段屬性上這樣使用
@JsonDeserialize(using = CustomStringDeserializer.class) private String name;
還有一種情形是反序列化的時候如果字段是形如“”的空字符串,想轉(zhuǎn)換成null,那就不需要覆寫 getNullValue() ,直接在deserialize中處理就好。
jackson解決:null到"", 空值處理為空串
1.一個比較頭疼的問題
jackson + spring 支持rest接口,輸出的JSON 對于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>
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于在IDEA中SpringBoot項目中activiti工作流的使用詳解
這篇文章主要介紹了關(guān)于在IDEA中SpringBoot項目中activiti工作流的使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-08-08
教你通過B+Tree平衡多叉樹理解InnoDB引擎的聚集和非聚集索引
大家都知道B+Tree是從二叉樹演化而來,在這之前我們來先了解二叉樹、平衡二叉樹、平衡多叉樹,這篇文章主要介紹了通過B+Tree平衡多叉樹理解InnoDB引擎的聚集和非聚集索引,需要的朋友可以參考下2022-01-01
Java?根據(jù)XPATH批量替換XML節(jié)點中的值
這篇文章主要介紹了Java根據(jù)XPATH批量替換XML節(jié)點中的值,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09

