一:前言json
通過測試,Jackson有不少不合人意的地方,所以建議用Fastjson來替換;app
二:Jackson的坑測試
先定義實體類:ui
@Data @AllArgsConstructor @NoArgsConstructor @Accessors(chain = true) public class MockModel { private String fUid; private String fName; private String fGender; }
坑1:這裏我是用lombok的註解來自動生成構造方法和getter、setter;通過測試SpringBoot中默認的Jackson是不支持將JSON字符串序列化爲@Data註解的MockModel對象的(沒有手動定義getter和setter);spa
測試方式@RequestBody MockModel body;而後POST請求體參數就是對應的JSON字符串(徹底對應),可是jackson卻沒法轉換;(自定義getter和setter方法jackson能夠反序列化爲MockModel對象,而Fastjson是兩種均可以)code
坑2:mapping方法返回MockModel對象,jackson是能夠將MockModel對象轉換爲JSON字符串,可是屬性名卻轉換的很坑爹,本來我須要的是{"fUid":xxx...}可是通過jackson轉換後key都變成了小寫,即fuid而非fUid;orm
三:用Fastjson替換Jackson的方式對象
直接聲明一個Bean便可:(注意,這個並不會覆蓋掉Jackson,只不過添加了一個比默認的更優先的HttpMessageConverter)blog
@Bean public HttpMessageConverters fastJsonHttpMessageConverters(){ //1.須要定義一個convert轉換消息的對象; FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter(); //2:添加fastJson的配置信息; FastJsonConfig fastJsonConfig = new FastJsonConfig(); /** * TODO 第一個SerializerFeature.PrettyFormat能夠省略,畢竟這會形成額外的內存消耗和流量,第二個是用來指定當屬性值爲null是是否輸出:pro:null
* SerializerFeature.SkipTransientField */ fastJsonConfig.setSerializerFeatures(SerializerFeature.WriteMapNullValue); //3處理中文亂碼問題 List<MediaType> fastMediaTypes = new ArrayList<>(); fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8); //4.在convert中添加配置信息. fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes); fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig); HttpMessageConverter<?> converter = fastJsonHttpMessageConverter; return new HttpMessageConverters(converter); }
測試有沒有替換成能夠經過設置SerializerFeature.PrettyFormat來看序列化的JSON字符串的格式就能夠看出;接口
也能夠經過下面的寫法來測試(下面的方式將會令序列化爲JSON字符串時變成{"f_uid":xx},本來是{"fUid":xx},可是input仍是能夠兩種都行)
經過這種形式能夠實現和某些接口對接JSON參數格式的特殊化,即定義專門和A系統對接的AModel而後用@JSONField(name = "xx_bb"),那麼和A系統傳的JSON字符串就會是特殊化的(以來對應的AModel),而其餘系統的則仍是默認的格式;
@JSONField(name = "f_uid") private String fUid; // TODO Fastjson是直接經過字段來匹配的,所以能夠用@Data,沒有getter和setter @JSONField也同樣會生效,若是但願某個字段不要序列化爲JSON字符串能夠加transient;
Fastjson沒有jackson中的坑1和坑2,且支持將如{"aa_bb":33}轉換爲屬性名aaBb爲其賦值33(且還支持部分屬性是aa_bb部分倒是uuMm的形式的轉換)
三:JSON格式的一些注意事項
1.key-value的分隔符只能是:號而不能是=號
2.數值字符串能夠轉換爲數值屬性,數值也能夠轉換爲字符串屬性(如fUid:33能夠轉換爲MockModel中String的fUid),至少Fastjson支持;
3.key部分最好都用""包裹,通過測試有一些JSON包是不支持如{fUid:33}的,只支持{"fUid":33}
4.主流的JSON包都支持如{"fName":null}的寫法;
四:其餘
SpringBoot裏GET方法能夠不設置Content-Type(由於都不會用到);可是POST必須設置這個屬性,並且貌似還不能是*/*;xx的類型??,好比上面的json參數就要Content-Type:application/json;charset=utf8(charset能夠不要,可是最好寫上)