Json數(shù)據(jù)交互處理

JSON

JSON(JavaScript Object Notation, JS 對象簡譜) 是一種輕量級的數(shù)據(jù)交換格式。它基于 ECMAScript (歐洲計算機協(xié)會制定的js規(guī)范)的一個子集,采用完全獨立于編程語言的文本格式來存儲和表示數(shù)據(jù)概说。簡潔和清晰的層次結(jié)構(gòu)使得 JSON 成為理想的數(shù)據(jù)交換語言。 易于人閱讀和編寫竖哩,同時也易于機器解析和生成,并有效地提升網(wǎng)絡傳輸效率脊僚。

  • JSON(JavaScript Object Notation, JS 對象標記) 是一種輕量級的數(shù)據(jù)交換格式相叁,目前使用特別廣泛。
  • 采用完全獨立于編程語言的文本格式來存儲和表示數(shù)據(jù)。
  • 簡潔和清晰的層次結(jié)構(gòu)使得 JSON 成為理想的數(shù)據(jù)交換語言钝荡。
  • 易于人閱讀和編寫,同時也易于機器解析和生成舶衬,并有效地提升網(wǎng)絡傳輸效率埠通。

在 JavaScript 語言中,一切都是對象逛犹。因此端辱,任何JavaScript 支持的類型都可以通過 JSON 來表示,例如字符串虽画、數(shù)字舞蔽、對象、數(shù)組等码撰∩粒看看他的要求和語法格式:

  • 對象表示為鍵值對,數(shù)據(jù)由逗號分隔
  • 花括號保存對象
  • 方括號保存數(shù)組

JSON 鍵值對是用來保存 JavaScript 對象的一種方式脖岛,和 JavaScript 對象的寫法也大同小異朵栖,鍵/值對組合中的鍵名寫在前面并用雙引號 "" 包裹,使用冒號 : 分隔柴梆,然后緊接著值

image-20200601093324934
image-20200601093431892

JSON 與 JS 對象的關(guān)系

很多人搞不清楚 JSON 和 JS 對象的關(guān)系陨溅,甚至連誰是誰都不清楚。其實绍在,可以這么理解:

JSON 是 JS 對象的字符串表示法门扇,它使用文本表示一個 JS 對象的信息,本質(zhì)是一個字符串偿渡。

image-20200601093734592

JSON 和 JS 對象互轉(zhuǎn)

要實現(xiàn)從JSON字符串轉(zhuǎn)換為JS對象臼寄,使用 JSON.parse() 方法

image-20200601094008094

要實現(xiàn)從JS對象轉(zhuǎn)換為JSON字符串,使用 JSON.stringify() 方法

image-20200601094023563
image-20200601094106226
image-20200601094203842

Jackson

{% note success %}

環(huán)境搭建

{% endnote %}

建立一個SpringMvc項目溜宽。導入相關(guān)的依賴和jackson依賴

<!--jackson--> 
<dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.8</version>
        </dependency>
        <!--Spring-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.1.9.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.1.9.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
        </dependency>

        <!--Servlet - JSP -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
</dependency>

SpringMVC配置文件——springmvc-servlet.xml

image-20200601103012191
<?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">

    <!-- 自動掃描指定的包脯厨,下面所有注解類交給IOC容器管理 -->
    <context:component-scan base-package="com.kylin.controller"/>
    <!---->
    <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>
    <!-- 視圖解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          id="internalResourceViewResolver">
        <!-- 前綴 -->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!-- 后綴 -->
        <property name="suffix" value=".jsp"/>
    </bean>
    <!-- 設置靜態(tài)資源不過濾 -->
    <mvc:resources location="/static/" mapping="/static/**" />
</beans>

web.xml文件

image-20200601103052040
<?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.注冊servlet-->
  <servlet>
    <servlet-name>SpringMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--通過初始化參數(shù)指定SpringMVC配置文件的位置,進行關(guān)聯(lián)-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc-servlet.xml</param-value>
    </init-param>
    <!-- 啟動順序坑质,數(shù)字越小合武,啟動越早 -->
    <load-on-startup>1</load-on-startup>
  </servlet>

  <!--所有請求都會被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>

創(chuàng)建一個pojo包,User類涡扼。(構(gòu)造器稼跳,getter和setter方法,重寫toString)

image-20200601102602771
public class User {
    private String name;
    private int age;
    private String sex;
  }

創(chuàng)建一個controller類吃沪,編寫一個UserController類汤善。

<mark>注意:由于使用的是SpringMVC。正常返回他會走視圖解析器,而json需要返回的是一個字符串红淡。所有我們使用ResponseBody注解不狮。但是由于SpringMVC的@ResponseBody注解集成Jackson。返回對象就會自動轉(zhuǎn)換成Json字符串在旱。</mark>

首先創(chuàng)建一個jackson的對象映射器摇零,用來解析數(shù)據(jù)

ObjectMapper mapper = new ObjectMapper();

使用writeValueAsString(Object)轉(zhuǎn)換成Json字符串

mapper.writeValueAsString(Object);

image-20200601110109612
image-20200601110622661

直接返回User對象

image-20200601110652720

我們發(fā)現(xiàn)使用Jackson轉(zhuǎn)換對象為json字符串出現(xiàn)了亂碼我們可以在RequestMapping注解中的produces配置編碼格式produces = "application/json;charset=utf-8"

image-20200601110815869

解決了亂碼問題!

image-20200601111032046

{% note success %}

亂碼統(tǒng)一解決

{% endnote %}

但是沒錯這樣配置還是有點麻煩桶蝎。我么可以通過配置SpringMVC的配置文件配置mvc:annotation-driven中的mvc:message-converters

image-20200601111436298

在編寫一個請求驻仅,將一個list對象轉(zhuǎn)換為json字符串

image-20200601111652201

此時我們沒有配置RequestMapping注解中的produces配置編碼格式。也不會出現(xiàn)亂碼問題了

image-20200601111919426

{% note success %}

輸出時間對象

{% endnote %}

image-20200601112242370
image-20200601112259960
  • 默認日期格式會變成一個數(shù)字登渣,是1970年1月1日到當前日期的毫秒數(shù)噪服!
  • Jackson 默認是會把時間轉(zhuǎn)成timestamps形式

解決方案:取消timestamps形式 , 自定義時間格式mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

image-20200601112358940

輸出指定格式日期

image-20200601112428599

{% note success %}

抽取為工具類

{% endnote %}

將日期格式抽取為一個工具類胜茧。創(chuàng)建一個utils包粘优,編寫一個JsonUtils類

image-20200601112943661
public class JsonUtils {

    public static String getJson(Date date){
        return getJson(date,"yyyy-MM-dd HH:mm:ss");
    }

    public static String getJson(Date date, String pattern) {

        ObjectMapper mapper = new ObjectMapper();
        //不使用時間戳的方式
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        //自定義日期格式對象
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        //指定日期格式
        mapper.setDateFormat(sdf);
        String str = null;
        try {
            str = mapper.writeValueAsString(date);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return str;
    }
}
image-20200601113055559

成功!

image-20200601113146177

FastJson

image-20200601183706676

fastjson.jar是阿里開發(fā)的一款專門用于Java開發(fā)的包,可以方便的實現(xiàn)json對象與JavaBean對象的轉(zhuǎn)換呻顽,實現(xiàn)JavaBean對象與json字符串的轉(zhuǎn)換敬飒,實現(xiàn)json對象與json字符串的轉(zhuǎn)換。實現(xiàn)json的轉(zhuǎn)換方法很多芬位,最后的實現(xiàn)結(jié)果都是一樣的无拗。

導入fastjson的pom依賴

<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>fastjson</artifactId>
   <version>1.2.60</version>
</dependency>
  • 提供服務器端、安卓客戶端兩種解析工具昧碉,性能表現(xiàn)較好英染。
  • 提供了 toJSONString()parseObject() 方法來將 Java 對象與 JSON 相互轉(zhuǎn)換。調(diào)用toJSONString方 法即可將對象轉(zhuǎn)換成 JSON 字符串被饿,parseObject 方法則反過來將 JSON 字符串轉(zhuǎn)換成對象四康。
  • 允許轉(zhuǎn)換預先存在的無法修改的對象(只有class、無源代碼)狭握。
  • Java泛型的廣泛支持闪金。
  • 允許對象的自定義表示、允許自定義序列化類论颅。
  • 支持任意復雜對象(具有深厚的繼承層次和廣泛使用的泛型類型)哎垦。

編寫一個FastJsonDemo類進行測試

image-20200601184640464
public class FastJsonDemo {
    public static void main(String[] args) {
        //創(chuàng)建一個對象
        User user1 = new User("kylin1號", 3, "男");
        User user2 = new User("kylin2號", 3, "男");
        User user3 = new User("kylin3號", 3, "男");
        User user4 = new User("kylin4號", 3, "男");
        List<User> list = new ArrayList<User>();
        list.add(user1);
        list.add(user2);
        list.add(user3);
        list.add(user4);

        System.out.println("*******Java對象 轉(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("\n****** JSON字符串 轉(zhuǎn) Java對象*******");
        User jp_user1 = JSON.parseObject(str2, User.class);
        System.out.println("JSON.parseObject(str2,User.class)==>" + jp_user1);

        System.out.println("\n****** Java對象 轉(zhuǎn) JSON對象 ******");
        JSONObject jsonObject1 = (JSONObject) JSON.toJSON(user2);
        System.out.println("(JSONObject) JSON.toJSON(user2)==>" + jsonObject1.getString("name"));

        System.out.println("\n****** JSON對象 轉(zhuǎn) Java對象 ******");
        User to_java_user = JSON.toJavaObject(jsonObject1, User.class);
        System.out.println("JSON.toJavaObject(jsonObject1, User.class)==>" + to_java_user);
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市恃疯,隨后出現(xiàn)的幾起案子漏设,更是在濱河造成了極大的恐慌,老刑警劉巖今妄,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件郑口,死亡現(xiàn)場離奇詭異鸳碧,居然都是意外死亡,警方通過查閱死者的電腦和手機犬性,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門瞻离,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人乒裆,你說我怎么就攤上這事套利。” “怎么了缸兔?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長吹艇。 經(jīng)常有香客問我惰蜜,道長,這世上最難降的妖魔是什么受神? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任抛猖,我火速辦了婚禮,結(jié)果婚禮上鼻听,老公的妹妹穿的比我還像新娘财著。我一直安慰自己,他們只是感情好撑碴,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布撑教。 她就那樣靜靜地躺著,像睡著了一般醉拓。 火紅的嫁衣襯著肌膚如雪伟姐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天亿卤,我揣著相機與錄音愤兵,去河邊找鬼。 笑死排吴,一個胖子當著我的面吹牛秆乳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播钻哩,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼屹堰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了街氢?” 一聲冷哼從身側(cè)響起双藕,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎阳仔,沒想到半個月后忧陪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扣泊,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年嘶摊,在試婚紗的時候發(fā)現(xiàn)自己被綠了延蟹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡叶堆,死狀恐怖阱飘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情虱颗,我是刑警寧澤沥匈,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站忘渔,受9級特大地震影響高帖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜畦粮,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一散址、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宣赔,春花似錦预麸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至钩蚊,卻和暖如春犁罩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背两疚。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工床估, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人诱渤。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓丐巫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親勺美。 傳聞我的和親對象是個殘疾皇子递胧,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容