SpringBoot關於JSON交互問題javascript
1、Json交互的優點前端
1.JSON原本就是javascript裏的內容,客戶端能夠很容易對JSON數據解析. 2.數據格式簡單、易於讀寫、帶寬佔用小、不錯的可讀性、可表示各種複雜性的數據。 3.服務端也能直接使用JSON格式數據,簡化了代碼開發量,易於維護。
2、SpringBoot之Controller中的使用java
1.實際項目中,先後端分離成爲主流趨勢,後臺負責業務邏輯處理,前端負責數據展現。後臺接口返回數據通常使用json格式,也可能使用xml。使用json報文。瞭解下面註解。spring
@Controller :處理http請求。 @ResponseBody :返回的結果直接寫入 HTTP 響應正文,@Responsebody 後返回結果不會被解析爲跳轉路徑, 直接寫入HTTP 響應正文中。 @RestController :註解至關於@ResponseBody + @Controller合在一塊兒的做用。(Spring4以後新加的註解)。 @Controller @RequestMapping("/user") public class UsersController { @GetMapping("/getUser") @ResponseBody public User getUser() { User user=new User(); user.setId(24); user.setLoginName("Kobe"); user.setRealName("Bryant"); user.setPasswd("123456"); return user; } } 訪問url:http://localhost:9090/oms/user/getUser 返回結果: { "id": 24, "lastModifyUId": 0, "lastModifyTime": null, "lastLoginTime": null, "loginIP": null, "loginName": "Kobe", "nickName": null, "realName": "Bryant", "passwd": "123456", "phone": null, "email": null, "areaId": null, "areaName": null, "status": null, "onlineStatus": 0, "salt": null, "isPreinstall": 0, "roleIds": null, "roles": null, "userPermissions": null, "rememberMe": false }
3、SpringBoot的默認JSON解析器(Jackson)json
1.由上面例子可見並未作任何配置,返回值爲User對象,直接轉換爲JSON格式輸出。Spring-Boot對json作了默認實現,使用的是內置Jackson轉換器。後端
2.從上面返回結果能夠發現兩個問題,第1、許多爲null的字段也輸出。第2、有些字段不想返回給前端(好比說密碼)。app
1.在Bean類上添加註@JsonInclude(Include.NON_NULL)配置. @JsonInclude(Include.NON_NULL) public class User implements Serializable{ private static final long serialVersionUID = 1L; private int id; private int lastModifyUId; private Date lastModifyTime; private String lastLoginTime; //登錄時間 private String loginIP; //登錄IP private String loginName; ...... 其中枚舉類型屬性: 1.Include.Include.ALWAYS : 默認 2.Include.NON_DEFAULT : 默認值不序列化 3.Include.NON_EMPTY : 屬性爲 空("") 或者爲 NULL 都不序列化 4.Include.NON_NULL : 屬性爲NULL 不序列化 返回結果: { "id": 24, "lastModifyUId": 0, "loginName": "Kobe", "realName": "Bryant", "passwd": "123456", "onlineStatus": 0, "isPreinstall": 0, "rememberMe": false } 2.從返回結果看值爲null的字段沒有序列化,可是passwd仍是返回出來.能夠再Bean類的不須要序列化的字段上加@JsonIgnore註解. 返回結果: { "id": 24, "lastModifyUId": 0, "loginName": "Kobe", "realName": "Bryant", "onlineStatus": 0, "isPreinstall": 0, "rememberMe": false }
4、SpringBoot自定義JSON解析器(fastjson)框架
1.通常開發中習慣使用阿里的fastjson解析工具,fastjson具備極快的性能.fastjson是一個java庫集合,能夠操做任何java對象,直接使用泛型.fastJson默認將null的字段去除。前後端分離
添加依賴(注意解決衝突) <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency> 配置fastjson有兩種方式 第一種: ① 啓動類繼承 WebMvcConfigurerAdapter 。 ②覆蓋configureMessageConverters方法。 @SpringBootApplication //申明讓spring boot自動給程序進行必要的配置 public class AppStart extends WebMvcConfigurerAdapter { public static void main(String[] args) { SpringApplication.run(AppStart.class, args); } /** * 替換框架json爲fastjson */ @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { super.configureMessageConverters(converters); FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter(); FastJsonConfig fastJsonConfig = new FastJsonConfig(); fastJsonConfig.setSerializerFeatures( SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullNumberAsZero, SerializerFeature.WriteNullStringAsEmpty ); // 處理中文亂碼問題 List<MediaType> fastMediaTypes = new ArrayList<>(); fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8); fastConverter.setSupportedMediaTypes(fastMediaTypes); fastConverter.setFastJsonConfig(fastJsonConfig); //處理字符串, 避免直接返回字符串的時候被添加了引號 StringHttpMessageConverter smc = new StringHttpMessageConverter(Charset.forName("UTF-8")); converters.add(smc); converters.add(fastConverter); } }
第二種:ide
@Bean注入第三方的json解析框架 @Bean//使用@Bean注入fastJsonHttpMessageConvert public HttpMessageConverters fastJsonHttpMessageConverters(){ //1.須要定義一個Convert轉換消息的對象 FastJsonHttpMessageConverter fastConverter=new FastJsonHttpMessageConverter(); //2.添加fastjson的配置信息,好比是否要格式化返回的json數據 FastJsonConfig fastJsonConfig=new FastJsonConfig(); //SerializerFeature.WriteMapNullValue序列化null的字段 fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat); //3.在convert中添加配置信息 fastConverter.setFastJsonConfig(fastJsonConfig); HttpMessageConverter<?> converter=fastConverter; return new HttpMessageConverters(converter); }
實體類中不須要序列化的字段可添加註解@JSONField(serialize=false)。
若是須要序列化null的字段,也可進行配置。具體可查閱fastJson的配置。