1. 程式人生 > 其它 >android responsebody轉json_SpringBoot 專案開發是如何返回 json 資料以及資料封裝

android responsebody轉json_SpringBoot 專案開發是如何返回 json 資料以及資料封裝

技術標籤:android responsebody轉json

本文目錄如下:

  • 1. Spring Boot 預設對Json的處理
    • 1.1 建立 User 實體類
    • 1.2 建立Controller類
    • 1.3 測試不同資料型別返回的json
    • 1.4 jackson 中對null的處理
  • 2. 使用阿里巴巴FastJson的設定
    • 2.1 jackson 和 fastJson 的對比
    • 2.2 fastJson依賴匯入
    • 2.2 使用 fastJson 處理 null
  • 3. 封裝統一返回的資料結構
    • 3.1 定義統一的 json 結構
    • 3.2 修改 Controller 中的返回值型別及測試
  • 4. 總結

在專案開發中,介面與介面之間,前後端之間資料的傳輸都使用 Json 格式,在 Spring Boot 中,介面返回 Json 格式的資料很簡單,在 Controller 中使用@RestController註解即可返回 Json 格式的資料,@RestController也是 Spring Boot 新增的一個註解,我們點進去看一下該註解都包含了哪些東西。

@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@[email protected]@ResponseBodypublic@interfaceRestController {Stringvalue()default"";}

可以看出, @RestController 註解包含了原來的 @Controller 和 @ResponseBody 註解,使用過 Spring 的朋友對 @Controller 註解已經非常瞭解了,這裡不再贅述, @ResponseBody 註解是將返回的資料結構轉換為 Json 格式。所以在預設情況下,使用了 @RestController 註解即可將返回的資料結構轉換成 Json 格式,Spring Boot 中預設使用的 Json 解析技術框架是 jackson。我們點開 pom.xml 中的 spring-boot-starter-web 依賴,可以看到一個 spring-boot-starter-json 依賴:

org.springframework.bootspring-boot-starter-json2.0.3.RELEASEcompile

Spring Boot 中對依賴都做了很好的封裝,可以看到很多 spring-boot-starter-xxx 系列的依賴,這是 Spring Boot 的特點之一,不需要人為去引入很多相關的依賴了,starter-xxx 系列直接都包含了所必要的依賴,所以我們再次點進去上面這個 spring-boot-starter-json 依賴,可以看到:

com.fasterxml.jackson.corejackson-databind2.9.6compilecom.fasterxml.jackson.datatypejackson-datatype-jdk82.9.6compilecom.fasterxml.jackson.datatypejackson-datatype-jsr3102.9.6compilecom.fasterxml.jackson.modulejackson-module-parameter-names2.9.6compile

到此為止,我們知道了 Spring Boot 中預設使用的 json 解析框架是 jackson。下面我們看一下預設的 jackson 框架對常用資料型別的轉 Json 處理。

1. Spring Boot 預設對Json的處理

在實際專案中,常用的資料結構無非有類物件、List物件、Map物件,我們看一下預設的 jackson 框架對這三個常用的資料結構轉成 json 後的格式如何。

1.1 建立 User 實體類

為了測試,我們需要建立一個實體類,這裡我們就用 User 來演示。

publicclassUser {privateLong id;privateStringusername;privateStringpassword;/* 省略get、set和帶參構造方法 */}

1.2 建立Controller類

然後我們建立一個 Controller,分別返回 User物件、List 和 Map。

@[email protected]("/json")publicclassJsonController {@RequestMapping("/user")publicUser getUser() {returnnewUser(1,"倪升武","123456");}@RequestMapping("/list")publicList getUserList() {List userList =newArrayList<>();User user1 =newUser(1,"倪升武","123456");User user2 =newUser(2,"達人課","123456");userList.add(user1);userList.add(user2);returnuserList;}@RequestMapping("/map")publicMap getMap() {Map map =newHashMap<>(3);User user =newUser(1,"倪升武","123456");map.put("作者資訊", user);map.put("部落格地址","http://blog.itcodai.com");map.put("CSDN地址","http://blog.csdn.net/eson_15");map.put("粉絲數量",4153);returnmap;}}

1.3 測試不同資料型別返回的json

OK,寫好了介面,分別返回了一個 User 物件、一個 List 集合和一個 Map 集合,其中 Map 集合中的 value 存的是不同的資料型別。接下來我們依次來測試一下效果。

在瀏覽器中輸入:localhost:8080/json/user 返回 json 如下:

{"id":1,"username":"倪升武","password":"123456"}

在瀏覽器中輸入:localhost:8080/json/list 返回 json 如下:

[{"id":1,"username":"倪升武","password":"123456"},{"id":2,"username":"達人課","password":"123456"}]

在瀏覽器中輸入:localhost:8080/json/map 返回 json 如下:

{"作者資訊":{"id":1,"username":"倪升武","password":"123456"},"CSDN地址":"http://blog.csdn.net/eson_15","粉絲數量":4153,"部落格地址":"http://blog.itcodai.com"}

可以看出,map 中不管是什麼資料型別,都可以轉成相應的 json 格式,這樣就非常方便。

1.4 jackson 中對null的處理

在實際專案中,我們難免會遇到一些 null 值出現,我們轉 json 時,是不希望有這些 null 出現的,比如我們期望所有的 null 在轉 json 時都變成 "" 這種空字串,那怎麼做呢?在 Spring Boot 中,我們做一下配置即可,新建一個 jackson 的配置類:

@ConfigurationpublicclassJacksonConfig{@Bean@Primary@ConditionalOnMissingBean(ObjectMapper.class)publicObjectMapperjacksonObjectMapper(Jackson2ObjectMapperBuilder builder){ObjectMapper objectMapper = builder.createXmlMapper(false).build();objectMapper.getSerializerProvider().setNullValueSerializer(newJsonSerializer() {@Overridepublicvoidserialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)throwsIOException{jsonGenerator.writeString("");}});returnobjectMapper;}}

然後我們修改一下上面返回 map 的介面,將幾個值改成 null 測試一下:

@RequestMapping("/map")publicMap getMap() {Map map =newHashMap<>(3);User user =newUser(1,"倪升武",null);map.put("作者資訊", user);map.put("部落格地址","http://blog.csdn.com/eson_15");map.put("CSDN地址",null);map.put("粉絲數量",4153);returnmap;}

重啟專案,再次輸入:localhost:8080/json/map,可以看到 jackson 已經將所有 null 欄位轉成了空字串了。

{"作者資訊":{"id":1,"username":"倪升武","password":""},"CSDN地址":"","粉絲數量":4153,"部落格地址":"http://blog.csdn.com/eson_15"}

2. 使用阿里巴巴FastJson的設定

2.1 jackson 和 fastJson 的對比

有很多朋友習慣於使用阿里巴巴的 fastJson 來做專案中 json 轉換的相關工作,目前我們專案中使用的就是阿里的 fastJson,那麼 jackson 和 fastJson 有哪些區別呢?根據網上公開的資料比較得到下表。

4a77a81d5156062cd3786b34bff97b74.png

關於 fastJson 和 jackson 的對比,網上有很多資料可以檢視,主要是根據自己實際專案情況來選擇合適的框架。從擴充套件上來看,fastJson 沒有 jackson 靈活,從速度或者上手難度來看,fastJson 可以考慮,我們專案中目前使用的是阿里的 fastJson,挺方便的。

2.2 fastJson依賴匯入

使用 fastJson 需要匯入依賴,本課程使用 1.2.35 版本,依賴如下:

com.alibabafastjson1.2.35

2.2 使用 fastJson 處理 null

使用 fastJson 時,對 null 的處理和 jackson 有些不同,需要繼承 WebMvcConfigurationSupport 類,然後覆蓋 configureMessageConverters 方法,在方法中,我們可以選擇對要實現 null 轉換的場景,配置好即可。如下:

@ConfigurationpublicclassfastJsonConfigextendsWebMvcConfigurationSupport{/*** 使用阿里 FastJson 作為JSON MessageConverter*@paramconverters*/@Overridepublicvoid configureMessageConverters(List> converters) {FastJsonHttpMessageConverter converter =newFastJsonHttpMessageConverter();FastJsonConfig config =newFastJsonConfig();config.setSerializerFeatures(// 保留map空的欄位SerializerFeature.WriteMapNullValue,// 將String型別的null轉成""SerializerFeature.WriteNullStringAsEmpty,// 將Number型別的null轉成0SerializerFeature.WriteNullNumberAsZero,// 將List型別的null轉成[]SerializerFeature.WriteNullListAsEmpty,// 將Boolean型別的null轉成falseSerializerFeature.WriteNullBooleanAsFalse,// 避免迴圈引用SerializerFeature.DisableCircularReferenceDetect);converter.setFastJsonConfig(config);converter.setDefaultCharset(Charset.forName("UTF-8"));List mediaTypeList =newArrayList<>();// 解決中文亂碼問題,相當於在Controller上的@RequestMapping中加了個屬性produces = "application/json"mediaTypeList.add(MediaType.APPLICATION_JSON);converter.setSupportedMediaTypes(mediaTypeList);converters.add(converter);}}

3. 封裝統一返回的資料結構

以上是 Spring Boot 返回 json 的幾個代表的例子,但是在實際專案中,除了要封裝資料之外,我們往往需要在返回的 json 中新增一些其他資訊,比如返回一些狀態碼 code ,返回一些 msg 給呼叫者,這樣呼叫者可以根據 code 或者 msg 做一些邏輯判斷。所以在實際專案中,我們需要封裝一個統一的 json 返回結構儲存返回資訊。

3.1 定義統一的 json 結構

由於封裝的 json 資料的型別不確定,所以在定義統一的 json 結構時,我們需要用到泛型。統一的 json 結構中屬性包括資料、狀態碼、提示資訊即可,構造方法可以根據實際業務需求做相應的新增即可,一般來說,應該有預設的返回結構,也應該有使用者指定的返回結構。如下:

publicclassJsonResult {privateT data;privateString code;privateString msg;/*** 若沒有資料返回,預設狀態碼為0,提示資訊為:操作成功!*/publicJsonResult(){this.code ="0";this.msg ="操作成功!";}/*** 若沒有資料返回,可以人為指定狀態碼和提示資訊* @param code* @param msg*/publicJsonResult(String code, String msg){this.code = code;this.msg = msg;}/*** 有資料返回時,狀態碼為0,預設提示資訊為:操作成功!* @param data*/publicJsonResult(T data){this.data = data;this.code ="0";this.msg ="操作成功!";}/*** 有資料返回,狀態碼為0,人為指定提示資訊* @param data* @param msg*/publicJsonResult(T data, String msg){this.data = data;this.code ="0";this.msg = msg;}// 省略get和set方法}

3.2 修改 Controller 中的返回值型別及測試

由於 JsonResult 使用了泛型,所以所有的返回值型別都可以使用該統一結構,在具體的場景將泛型替換成具體的資料型別即可,非常方便,也便於維護。在實際專案中,還可以繼續封裝,比如狀態碼和提示資訊可以定義一個列舉型別,以後我們只需要維護這個列舉型別中的資料即可(在本課程中就不展開了)。根據以上的 JsonResult,我們改寫一下 Controller,如下:

@[email protected]("/jsonresult")publicclassJsonResultController{@RequestMapping("/user")publicJsonResultgetUser(){User user =newUser(1,"倪升武","123456");returnnewJsonResult<>(user);}@RequestMapping("/list")publicJsonResultgetUserList(){List userList =newArrayList<>();User user1 =newUser(1,"倪升武","123456");User user2 =newUser(2,"達人課","123456");userList.add(user1);userList.add(user2);returnnewJsonResult<>(userList,"獲取使用者列表成功");}@RequestMapping("/map")publicJsonResultgetMap(){Map map =newHashMap<>(3);User user =newUser(1,"倪升武",null);map.put("作者資訊", user);map.put("部落格地址","http://blog.csdn.com/eson_15");map.put("CSDN地址",null);map.put("粉絲數量",4153);returnnewJsonResult<>(map);}}

我們重新在瀏覽器中輸入:localhost:8080/jsonresult/user 返回 json 如下:

{"code":"0","data":{"id":1,"password":"123456","username":"倪升武"},"msg":"操作成功!"}

輸入:localhost:8080/jsonresult/list,返回 json 如下:

{"code":"0","data":[{"id":1,"password":"123456","username":"倪升武"},{"id":2,"password":"123456","username":"達人課"}],"msg":"獲取使用者列表成功"}

輸入:localhost:8080/jsonresult/map,返回 json 如下:

{"code":"0","data":{"作者資訊":{"id":1,"password":"","username":"倪升武"},"CSDN地址":null,"粉絲數量":4153,"部落格地址":"http://blog.csdn.com/eson_15"},"msg":"操作成功!"}

通過封裝,我們不但將資料通過 json 傳給前端或者其他介面,還帶上了狀態碼和提示資訊,這在實際專案場景中應用非常廣泛。

4. 總結

本節主要對 Spring Boot 中 json 資料的返回做了詳細的分析,從 Spring Boot 預設的 jackson 框架到阿里巴巴的 fastJson 框架,分別對它們的配置做了相應的講解。另外,結合實際專案情況,總結了實際專案中使用的 json 封裝結構體,加入了狀態碼和提示資訊,使得返回的 json 資料資訊更加完整。