Jackson 處理 null 或者 空字符串
Retrofit 配合 Jackson 反序列化,就是將字符串解析為java bean 對象 的時候 ,如果遇到服務端由于各種原因會導致 有些String類型的字段值為null ,需要替換為空字符串或者占位符“-”什么的,并且不確定 到底會在哪個字段,可以如下處理
這里要區分序列化和反序列化
序列化,就是處理java bean對象轉換為字符串,通常設置
1
|
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); |
這樣在java bean中對象有值為null ,就不會將這個字段或屬性序列化為字符串。
或者在java bean 模型定義中注解,表明不將其序列化
1
|
@JsonInclude (JsonInclude.Include.NON_NULL) |
反序列化,就是將服務器端返回的json串轉換為java 對象,通常在處理null值, 將某些值更改為指定格式也類似。可以如下操作
在使用jackson 的時候,通常會通過 compile ‘com.squareup.retrofit2:converter-jackson:2.3.0'集成 官方的 JacksonConverterFactory ,其實它除了自動引入jackson外,另外引入了三個類,可以拷貝出來,方便修改引用,其中只需要更改 JacksonConverterFactory.java 中的create函數即可。針對反序列化過程中String類型處理,添加自定義反序列化器。
1
2
3
4
5
6
7
|
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, 處理策略,這里是默認返回“-”。
1
2
3
4
5
6
7
8
9
10
11
12
|
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了,類中所有字段你都需要處理,因為這時,返回的是一個類,
1
2
3
4
5
6
|
public class CustomClassDeserializer extends JsonDeserializer<T> { @Override public T deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException { return null ; } } |
然后在類的bean上使用注解,表明該類用這個反序列化器來處理
1
2
|
@JsonDeserialize (using = CustomClassDeserializer. class ) class yourClass() |
如果是字段屬性級別的
需要在相應的字段屬性上這樣使用
1
2
|
@JsonDeserialize (using = CustomStringDeserializer. class ) private String name; |
還有一種情形是反序列化的時候如果字段是形如“”的空字符串,想轉換成null,那就不需要覆寫 getNullValue() ,直接在deserialize中處理就好。
jackson解決:null到"", 空值處理為空串
1.一個比較頭疼的問題
jackson + spring 支持rest接口,輸出的JSON 對于null的字符串是invoiceTitle: null,但是接受方希望返回的是invoiceTitle: ""。解決方法重寫ObjectMapper
2.代碼如下
1
2
3
4
5
6
7
8
9
10
11
|
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.配置如下
1
2
3
4
5
6
7
8
9
10
|
< 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 > |
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/wangyun522/article/details/78762184