在使用fastjson序列化物件的時候,預設是將null和"「的屬性過濾掉不參與序列化的。有時候我們需要將空的屬性輸出,所以需要我們設定序列化屬性,來滿足我們的需求。
在使用fastjson 1.2.60版本將物件轉化為json字串時,為處理map值為null的情況,採用了write_map_null_features屬性,但該屬性解析出來的key中缺少雙引號,在key包含特殊字元時,如「-」和「:」,下游服務在進行反序列化時出現無法解析的錯誤,從而出現問題。
fastjson serializerfeature介紹
使用fastjson解析為字串時,需要處理一些特殊情況,比如想要在解析後的字串中顯示物件中為null的字段。這個時候就需要用到fastjson的serializerfeature序列化屬性,有以下幾個常用屬性:
屬性含義
quotefieldnames
輸出key時是否使用雙引號,預設為true
usesinglequotes
使用單引號而不是雙引號,預設為false
writemapnullvalue
是否輸出值為null的字段,預設為false
writeenumusingtostring
enum輸出name()或者original,預設為false
useiso8601dateformat
date使用iso8601格式輸出,預設為false
writenulllistasempty
list欄位如果為null,輸出為,而非null
writenullstringasempty
字元型別字段如果為null,輸出為」「,而非null
writenullnumberaszero
數值字段如果為null,輸出為0,而非null
writenullbooleanasfalse
boolean欄位如果為null,輸出為false,而非null
skiptransientfield
如果是true,類中的get方法對應的field是transient,序列化時將會被忽略。預設為true
sortfield
按欄位名稱排序後輸出。預設為false
prettyformat
結果是否格式化,預設為false
writeclassname
序列化時寫入型別資訊,預設為false。反序列化是需用到disablecircularreferencedetect 消除對同一物件迴圈引用的問題,預設為false
writeslashasspecial
對斜槓』/'進行轉義
browsercompatible
將中文都會序列化為u***x格式,位元組數會多一些,但是能相容ie 6,預設為false
writedateusedateformat
全域性修改日期格式,預設為false。json.deffault_date_format = 「yyyy-mm-dd」;json.tojsonstring(obj, serializerfeature.writedateusedateformat);
disablecheckspecialchar
乙個物件的字串屬性中如果有特殊字元如雙引號,將會在轉成json時帶有反斜槓轉移符。如果不需要轉義,可以使用這個屬性。預設為false
除了上述的屬性之外,還有write_map_null_features,是以下幾個屬性的組合:
public
static
final
int write_map_null_features
= writemapnullvalue.
getmask()
| writenullbooleanasfalse.
getmask()
| writenulllistasempty.
getmask()
| writenullnumberaszero.
getmask()
| writenullstringasempty.
getmask()
;
fastjson write_map_null_features 案列說明
map key不包含特殊字元
public
static
void
main
(string[
] args)
system.out.
println
(json.
tojsonstring
(map, serializerfeature.writemapnullvalue));
// system.out.
println
(json.
tojsonstring
(map, serializerfeature.write_map_null_features));
// }
從上面測試可以看出,使用write_map_null_features,輸出的json字串key中並不包含雙引號,再進行反序列化測試結果:
public
static
void
main
(string[
] args)
jsonobject jsonobject = json.
parseobject
(test)
;system.out.
println
(json.
tojsonstring
(jsonobject));
// }
key包含特殊字元(「-」 「:」)的反序列化
public
static
void
main
(string[
] args)
jsonobject jsonobject = json.
parseobject
(test)
;system.out.
println
(json.
tojsonstring
(jsonobject));
// 丟擲異常 com.alibaba.fastjson.jsonexception
}
結論
從上面的測試可以看出write_map_null_features轉化為json字串時key是不包含雙引號的,當key中不存在特殊字元("-「或「:」)時,可以進行正常的反序列化操作,包含了上面的特殊字元時會出現無法解析的異常。
另外,對於不帶雙引號的key,gson也存在這樣的問題,但其可以正常解析含有"-「的特殊字元,無法解析包含」:"情況。
使用:
jsonobject.
tojsonstring
(bannern, serializerfeature.write_map_null_features)
;jsonobject.
tojsonstring
(bannern, serializerfeature.sortfield)
;
fastjson序列化排序問題
fastjson序列化,預設是用字母排序,那麼怎麼來實現按照自己定義的順序輸出,想要的json串呢?直接上 import com.alibaba.fastjson.annotation.jsontype 設定排序規則 jsontype orders public class transmessage...
fastjson序列化日期格式化
有時需要按照一定的格式顯示日期,這種操作多半在前端完成,比如在使用jquery.datatable多半在render函式中定義日期的格式,其實fastjson支援按照一定的日期格式格式化時間,只需做下面設定即可 1.jsonobject.deffault date format yyyy mm dd...
fastjson 過濾掉不需要序列化的屬性
第一種方式,使用propertyfilter。可根據屬性名稱或屬性值進行過濾。propertyfilter filter new propertyfilter false 無需序列化,不過濾出來 return false serializewriter out new serializewriter...