一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - 聊聊Spring MVC JSON數(shù)據(jù)交互的問(wèn)題

聊聊Spring MVC JSON數(shù)據(jù)交互的問(wèn)題

2022-03-06 00:59JD強(qiáng)子 Java教程

我們?cè)陂_(kāi)發(fā)中后端經(jīng)常需要接受來(lái)自于前端傳遞的Json字符串?dāng)?shù)據(jù),怎么把Json字符串轉(zhuǎn)換為Java對(duì)象呢?下面小編給大家?guī)?lái)了Spring MVC JSON數(shù)據(jù)交互的問(wèn)題,感興趣的朋友一起看看吧

我們?cè)陂_(kāi)發(fā)中后端經(jīng)常需要接受來(lái)自于前端傳遞的Json字符串?dāng)?shù)據(jù),怎么把Json字符串轉(zhuǎn)換為Java對(duì)象呢?后端也經(jīng)常需要給前端返回Json字符串,怎么把Java對(duì)象數(shù)據(jù)轉(zhuǎn)換為Json字符串返回呢?

回顧JSON

JSON(JavaScript Object Notation)

各個(gè)JSON技術(shù)比較

早期 JSON 的組裝和解析都是通過(guò)手動(dòng)編寫(xiě)代碼來(lái)實(shí)現(xiàn)的,這種方式效率不高,所以后來(lái)有許多的關(guān)于組裝和解析 JSON 格式信息的工具類(lèi)出現(xiàn),如 json-lib、Jackson、Gson 和 FastJson 等,可以解決 JSON 交互的開(kāi)發(fā)效率。

1)json-lib

json-lib 最早也是應(yīng)用廣泛的 JSON 解析工具,缺點(diǎn)是依賴(lài)很多的第三方包,如 commons-beanutils.jar、commons-collections-3.2.jar、commons-lang-2.6.jar、commons-logging-1.1.1.jar、ezmorph-1.0.6.jar 等。

對(duì)于復(fù)雜類(lèi)型的轉(zhuǎn)換,json-lib 在將 JSON 轉(zhuǎn)換成 Bean 時(shí)還有缺陷,比如一個(gè)類(lèi)里包含另一個(gè)類(lèi)的 List 或者 Map 集合,json-lib 從 JSON 到 Bean 的轉(zhuǎn)換就會(huì)出現(xiàn)問(wèn)題。

所以 json-lib 在功能和性能上面都不能滿(mǎn)足現(xiàn)在互聯(lián)網(wǎng)化的需求。

2)開(kāi)源的Jackson

開(kāi)源的 Jackson 是 Spring MVC 內(nèi)置的 JSON 轉(zhuǎn)換工具。相比 json-lib 框架,Jackson 所依賴(lài) jar 文件較少,簡(jiǎn)單易用并且性能也要相對(duì)高些。并且 Jackson 社區(qū)相對(duì)比較活躍,更新速度也比較快。

但是 Jackson 對(duì)于復(fù)雜類(lèi)型的 JSON 轉(zhuǎn)換 Bean 會(huì)出現(xiàn)問(wèn)題,一些集合 Map、List 的轉(zhuǎn)換出現(xiàn)問(wèn)題。而 Jackson 對(duì)于復(fù)雜類(lèi)型的 Bean 轉(zhuǎn)換 JSON,轉(zhuǎn)換的 JSON 格式不是標(biāo)準(zhǔn)的 JSON 格式。

3)Google的Gson

Gson 是目前功能最全的 JSON 解析神器,Gson 當(dāng)初是應(yīng) Google 公司內(nèi)部需求由 Google 自行研發(fā)。自從在 2008 年 5 月公開(kāi)發(fā)布第一版后,Gson 就已經(jīng)被許多公司或用戶(hù)應(yīng)用。

Gson 主要提供了 toJson 與 fromJson 兩個(gè)轉(zhuǎn)換函數(shù),不需要依賴(lài)其它的 jar 文件,就能直接在 JDK 上運(yùn)行。在使用這兩個(gè)函數(shù)轉(zhuǎn)換之前,需要先創(chuàng)建好對(duì)象的類(lèi)型以及其成員才能成功的將 JSON 字符串轉(zhuǎn)換為相對(duì)應(yīng)的對(duì)象。

類(lèi)里面只要有 get 和 set 方法,Gson 完全可以將復(fù)雜類(lèi)型的 JSON 到 Bean 或 Bean 到 JSON 的轉(zhuǎn)換,是 JSON 解析的神器。Gson 在功能上面無(wú)可挑剔,但性能比 FastJson 有所差距。

4)阿里巴巴的FastJson

FastJson 是用 Java 語(yǔ)言編寫(xiě)的高性能 JSON 處理器,由阿里巴巴公司開(kāi)發(fā)。

FastJson 不需要依賴(lài)其它的 jar 文件,就能直接在 JDK 上運(yùn)行。

FastJson 在復(fù)雜類(lèi)型的 Bean 轉(zhuǎn)換 JSON 上會(huì)出現(xiàn)一些問(wèn)題,可能會(huì)出現(xiàn)引用的類(lèi)型,導(dǎo)致 JSON 轉(zhuǎn)換出錯(cuò),需要制定引用。

FastJson 采用獨(dú)創(chuàng)的算法,將 parse 的速度提升到極致,超過(guò)所有 JSON 庫(kù)。

綜上 4 種 JSON 技術(shù)的比較,在項(xiàng)目選型的時(shí)候可以使用 Google 的 Gson 和阿里巴巴的 FastJson 兩種并行使用,如果只是功能要求,沒(méi)有性能要求,可以使用Google 的 Gson。如果有性能上面的要求可以使用 Gson 將 Bean 轉(zhuǎn)換 JSON 確保數(shù)據(jù)的正確,使用 FastJson 將 JSON 轉(zhuǎn)換 Bean。

JSON 數(shù)據(jù)轉(zhuǎn)換

Spring MVC 在數(shù)據(jù)綁定的過(guò)程中需要對(duì)傳遞數(shù)據(jù)的格式和類(lèi)型進(jìn)行轉(zhuǎn)換,它既可以轉(zhuǎn)換 String 等類(lèi)型的數(shù)據(jù),也可以轉(zhuǎn)換 JSON 等其他類(lèi)型的數(shù)據(jù)。

開(kāi)源的Jackson

新建一個(gè)module ,springmvc-05-json , 添加web的支持

導(dǎo)入jar文件

Maven 項(xiàng)目在 pom.xml 文件中添加以下依賴(lài)。

?
1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
   <groupId>com.fasterxml.jackson.core</groupId>
   <artifactId>jackson-databind</artifactId>
   <version>2.9.8</version>
</dependency>

配置Spring MVC核心配置文件

web.xml

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
        version="4.0">
 
   <!--1.注冊(cè)servlet-->
   <servlet>
       <servlet-name>SpringMVC</servlet-name>
       <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
       <!--通過(guò)初始化參數(shù)指定SpringMVC配置文件的位置,進(jìn)行關(guān)聯(lián)-->
       <init-param>
           <param-name>contextConfigLocation</param-name>
           <param-value>classpath:springmvc-servlet.xml</param-value>
       </init-param>
       <!-- 啟動(dòng)順序,數(shù)字越小,啟動(dòng)越早 -->
       <load-on-startup>1</load-on-startup>
   </servlet>
 
   <!--所有請(qǐng)求都會(huì)被springmvc攔截 -->
   <servlet-mapping>
       <servlet-name>SpringMVC</servlet-name>
       <url-pattern>/</url-pattern>
   </servlet-mapping>
 
   <filter>
       <filter-name>encoding</filter-name>
       <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
       <init-param>
           <param-name>encoding</param-name>
           <param-value>utf-8</param-value>
       </init-param>
   </filter>
   <filter-mapping>
       <filter-name>encoding</filter-name>
       <url-pattern>/</url-pattern>
   </filter-mapping>
 
</web-app>

springmvc-servlet.xml

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:context="http://www.springframework.org/schema/context"
      xmlns:mvc="http://www.springframework.org/schema/mvc"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       https://www.springframework.org/schema/mvc/spring-mvc.xsd">
 
   <!-- 自動(dòng)掃描指定的包,下面所有注解類(lèi)交給IOC容器管理 -->
   <context:component-scan base-package="com.kuang.controller"/>
 
   <!-- 視圖解析器 -->
   <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
         id="internalResourceViewResolver">
       <!-- 前綴 -->
       <property name="prefix" value="/WEB-INF/jsp/" />
       <!-- 后綴 -->
       <property name="suffix" value=".jsp" />
   </bean>
 
</beans>

創(chuàng)建POJO類(lèi)

?
1
2
3
4
5
6
7
8
package com.kuang.pojo;
 
public class User {
    private String name;
    private int age;
    private String sex;
 
    /**省略setter和getter方法*/

創(chuàng)建控制器

完成后端Java對(duì)象轉(zhuǎn)換為前端Json字符串

@ResponseBody

當(dāng)返回 POJO 對(duì)象時(shí)默認(rèn)轉(zhuǎn)換為 JSON 格式數(shù)據(jù)進(jìn)行響應(yīng)

聊聊Spring MVC JSON數(shù)據(jù)交互的問(wèn)題

這里我們需要兩個(gè)新東西,一個(gè)是@ResponseBody,一個(gè)是ObjectMapper對(duì)象

@RestController(推薦)

返回json字符串統(tǒng)一解決

聊聊Spring MVC JSON數(shù)據(jù)交互的問(wèn)題
在類(lèi)上直接使用 @RestController ,這樣子,里面所有的方法都只會(huì)返回 json 字符串了,不用再每一個(gè)都添加@ResponseBody !我們?cè)谇昂蠖朔蛛x開(kāi)發(fā)中,一般都使用

運(yùn)行測(cè)試

配置Tomcat運(yùn)行

聊聊Spring MVC JSON數(shù)據(jù)交互的問(wèn)題

解決亂碼

@RequestMaping的produces屬性

?
1
2
//produces:指定響應(yīng)體返回類(lèi)型和編碼
@RequestMapping(value = "/json1",produces = "application/json;charset=utf-8")

如果項(xiàng)目中有許多請(qǐng)求則每一個(gè)都要添加

Spring配置統(tǒng)一指定(推薦)

我們可以在springmvc的配置文件上添加一段消息StringHttpMessageConverter轉(zhuǎn)換配置,這樣就不用每次都去處理了

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<mvc:annotation-driven>
   <mvc:message-converters register-defaults="true">
       <bean class="org.springframework.http.converter.StringHttpMessageConverter">
           <constructor-arg value="UTF-8"/>
       </bean>
       <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
           <property name="objectMapper">
               <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                   <property name="failOnEmptyBeans" value="false"/>
               </bean>
           </property>
       </bean>
   </mvc:message-converters>
</mvc:annotation-driven>

聊聊Spring MVC JSON數(shù)據(jù)交互的問(wèn)題

測(cè)試集合輸出

控制器增加方法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
@RestController
public class UserController {
 
    //produces:指定響應(yīng)體返回類(lèi)型和編碼
    @RequestMapping(value = "/json1")
    public String json1() throws JsonProcessingException {
        //創(chuàng)建一個(gè)jackson的對(duì)象映射器,用來(lái)解析數(shù)據(jù)
        ObjectMapper mapper = new ObjectMapper();
        //創(chuàng)建一個(gè)對(duì)象
        User user = new User("秦疆1號(hào)", 3, "男");
        //將我們的對(duì)象解析成為json格式
        String str = mapper.writeValueAsString(user);
        //由于@ResponseBody注解,這里會(huì)將str轉(zhuǎn)成json格式返回;十分方便
        return str;
    }
 
    @RequestMapping("/json2")
    public String json2() throws JsonProcessingException {
 
        //創(chuàng)建一個(gè)jackson的對(duì)象映射器,用來(lái)解析數(shù)據(jù)
        ObjectMapper mapper = new ObjectMapper();
        //創(chuàng)建一個(gè)對(duì)象
        User user1 = new User("秦疆1號(hào)", 3, "男");
        User user2 = new User("秦疆2號(hào)", 3, "男");
        User user3 = new User("秦疆3號(hào)", 3, "男");
        User user4 = new User("秦疆4號(hào)", 3, "男");
        List<User> list = new ArrayList<User>();
        list.add(user1);
        list.add(user2);
        list.add(user3);
        list.add(user4);
 
        //將我們的對(duì)象解析成為json格式
        String str = mapper.writeValueAsString(list);
        return str;
    }
 
}

聊聊Spring MVC JSON數(shù)據(jù)交互的問(wèn)題

輸出時(shí)間對(duì)象

增加一個(gè)新的方法

聊聊Spring MVC JSON數(shù)據(jù)交互的問(wèn)題
聊聊Spring MVC JSON數(shù)據(jù)交互的問(wèn)題

默認(rèn)日期格式會(huì)變成一個(gè)數(shù)字,是1970年1月1日到當(dāng)前日期的毫秒數(shù)!

Jackson 默認(rèn)是會(huì)把時(shí)間轉(zhuǎn)成timestamps形式

自定義時(shí)間格式

聊聊Spring MVC JSON數(shù)據(jù)交互的問(wèn)題
聊聊Spring MVC JSON數(shù)據(jù)交互的問(wèn)題

抽取為工具類(lèi)

如果要經(jīng)常使用的話,這樣是比較麻煩的,我們可以將這些代碼封裝到一個(gè)工具類(lèi)中;我們?nèi)ゾ帉?xiě)下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.kuang.utils;
 
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
 
import java.text.SimpleDateFormat;
 
public class JsonUtils {
   
   public static String getJson(Object object) {
       return getJson(object,"yyyy-MM-dd HH:mm:ss");
  }
 
   public static String getJson(Object object,String dateFormat) {
       ObjectMapper mapper = new ObjectMapper();
       //不使用時(shí)間差的方式
       mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
       //自定義日期格式對(duì)象
       SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
       //指定日期格式
       mapper.setDateFormat(sdf);
       try {
           return mapper.writeValueAsString(object);
      } catch (JsonProcessingException e) {
           e.printStackTrace();
      }
       return null;
  }
}

聊聊Spring MVC JSON數(shù)據(jù)交互的問(wèn)題

我們使用工具類(lèi),代碼就更加簡(jiǎn)潔了!

阿里巴巴的FastJson

?
1
2
3
4
5
<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>fastjson</artifactId>
   <version>1.2.60</version>
</dependency>

fastjson.jar是阿里開(kāi)發(fā)的一款專(zhuān)門(mén)用于Java開(kāi)發(fā)的包,可以方便的實(shí)現(xiàn)json對(duì)象與JavaBean對(duì)象的轉(zhuǎn)換,實(shí)現(xiàn)JavaBean對(duì)象與json字符串的轉(zhuǎn)換,實(shí)現(xiàn)json對(duì)象與json字符串的轉(zhuǎn)換。實(shí)現(xiàn)json的轉(zhuǎn)換方法很多,最后的實(shí)現(xiàn)結(jié)果都是一樣的。

這種工具類(lèi),我們只需要掌握使用就好了,在使用的時(shí)候在根據(jù)具體的業(yè)務(wù)去找對(duì)應(yīng)的實(shí)現(xiàn)。和以前的commons-io那種工具包一樣,拿來(lái)用就好了!

fastjson 三個(gè)主要的類(lèi)

JSON代表 JSONObject和JSONArray的轉(zhuǎn)化

  • JSON類(lèi)源碼分析與使用
  • 仔細(xì)觀察這些方法,主要是實(shí)現(xiàn)json對(duì)象,json對(duì)象數(shù)組,javabean對(duì)象,json字符串之間的相互轉(zhuǎn)化。

JSONObject 代表 json 對(duì)象

  • JSONObject實(shí)現(xiàn)了Map接口, 猜想 JSONObject底層操作是由Map實(shí)現(xiàn)的。
  • JSONObject對(duì)應(yīng)json對(duì)象,通過(guò)各種形式的get()方法可以獲取json對(duì)象中的數(shù)據(jù),也可利用諸如size(),isEmpty()等方法獲取"鍵:值"對(duì)的個(gè)數(shù)和判斷是否為空。其本質(zhì)是通過(guò)實(shí)現(xiàn)Map接口并調(diào)用接口中的方法完成的。

JSONArray 代表 json 對(duì)象數(shù)組

內(nèi)部是有List接口中的方法來(lái)完成操作的。

代碼實(shí)例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package com.kuang.controller;
 
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.kuang.pojo.User;
 
import java.util.ArrayList;
import java.util.List;
 
public class FastJsonDemo {
   public static void main(String[] args) {
       //創(chuàng)建一個(gè)對(duì)象
       User user1 = new User("秦疆1號(hào)", 3, "男");
       User user2 = new User("秦疆2號(hào)", 3, "男");
       User user3 = new User("秦疆3號(hào)", 3, "男");
       User user4 = new User("秦疆4號(hào)", 3, "男");
       List<User> list = new ArrayList<User>();
       list.add(user1);
       list.add(user2);
       list.add(user3);
       list.add(user4);
 
       System.out.println("*******Java對(duì)象 轉(zhuǎn) JSON字符串*******");
       String str1 = JSON.toJSONString(list);
       System.out.println("JSON.toJSONString(list)==>"+str1);
       String str2 = JSON.toJSONString(user1);
       System.out.println("JSON.toJSONString(user1)==>"+str2);
 
       System.out.println(" ****** JSON字符串 轉(zhuǎn) Java對(duì)象*******");
       User jp_user1=JSON.parseObject(str2,User.class);
       System.out.println("JSON.parseObject(str2,User.class)==>"+jp_user1);
 
       System.out.println(" ****** Java對(duì)象 轉(zhuǎn) JSON對(duì)象 ******");
       JSONObject jsonObject1 = (JSONObject) JSON.toJSON(user2);
       System.out.println("(JSONObject) JSON.toJSON(user2)==>"+jsonObject1.getString("name"));
 
       System.out.println(" ****** JSON對(duì)象 轉(zhuǎn) Java對(duì)象 ******");
       User to_java_user = JSON.toJavaObject(jsonObject1, User.class);
       System.out.println("JSON.toJavaObject(jsonObject1, User.class)==>"+to_java_user);
  }
}

到此這篇關(guān)于Spring MVC JSON數(shù)據(jù)交互的文章就介紹到這了,更多相關(guān)Spring MVC JSON數(shù)據(jù)交互內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://blog.csdn.net/m0_53698336/article/details/121006145

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本高清视频一区二区 | 日韩精品亚洲专区在线影视 | 玩两个少妇女邻居 | 国产三级精品三级男人的天堂 | 亚洲 制服 欧美 中文字幕 | 亚洲福利电影一区二区? | 婷婷精品 | 性妲己 | 亚洲天堂精品在线 | 狠狠色婷婷日日综合五月 | 95视频免费看片 | 骚虎最新网址 | 日本在线看 | 暖暖的视频完整视频韩国免费 | 日本在线播放视频 | 欧美在线看片a免费观看 | 亚州性夜夜射在线观看 | 国产成人无精品久久久久国语 | www.9p234.com| 精品久久久久久无码人妻国产馆 | 男女乱淫真视频播放网站 | 青青青手机在线视频 | 秋霞鲁丝影院久久人人综合 | 日本高免费观看在线播放 | 99热这里只有精品一区二区三区 | 800精品国产导航 | 亚洲精品一二三四 | 明星ai人脸替换造梦在线播放 | 亚洲精品第五页中文字幕 | 日本黄色一区 | 国产第一页无线好源 | 热九九精品 | 91夜色视频| 精品国产91久久久久久久 | 91午夜剧场 | 精品一区视频 | 啪啪模拟器 | 精品乱lun小说 | sxx免费看观看美女 sss亚洲国产欧美一区二区 | 538免费精品视频搬运工 | 国产麻豆视频 |