fastjson序列化的屬性

2021-10-05 18:14:27 字數 3576 閱讀 3999

在使用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...