JSON 廣度學習

前言

近期的學習與大作業中,發現了Json的重要性,藉此機會記錄下來。

什麼是Json?

Json 是一種輕量級的數據交換的格式類型,是JavaScript對象表示法,應用廣泛。對於後端對象來說,Json 就是一個字符串,比如:

“ hello ” : 這是字符串
hello : 這是對象

Json長什麼樣?

以鍵值對的形式,key 和 value 都需要用雙引號引起來,中間用冒號分隔。

{"name":"張三","age":3,"sex":"男"}

Json和對象的差別

首先我們測試一段 JavaScript的代碼

    <script type="text/javascript">
        var user = {
            name : "張三",
            age : 3,
            sex : "男"
        };
        //將js對象轉化成json
        var json = JSON.stringify(user);
        console.log(json);
        console.log(user);

    </script>

結果如下:
在這裏插入圖片描述

通過瀏覽器控制檯顯示:
第一行是一 Json
第二行是 對象Object ,是可以展開的
二者的差別: 在對象中,key 沒有雙引號

Json數組

Json 數組給各個 Json 用中括號括起來。

[
	{"name":"張三","age":3,"sex":"男"},
	{"name":"張三2","age":23,"sex":"男"}
]

Json 的作用

前後端分離時代:

  • 後端部署後端,提供接口,提供數據
  • 前端獨立部署,負責渲染後端傳來的數據

那問題來了:前後端如何進行交互,數據的傳輸?

這裏用我最近做的安卓應用爲例。
使用的數據接口來源於聚合數據

Json 返回示例:

{
    "error_code": 0, /*返回碼*/
    "reason": "請求成功!",
    "result": [
        {
            "day": 1,  /*日*/
            "des": "1907年11月1日 電影導演吳永剛誕生   吳永剛,1907年11月1日生於江蘇吳縣。1932年後參加影片《三個摩登女性》、《母性之光》的拍攝工作。1934年在聯華影片公司編導處女作《神女》,一舉成名,...",  /*描述*/
            "id": 9000,  /*事件ID*/
            "lunar": "丁未年九月廿六",
            "month": 11,  /*月份*/
            "pic": "",  /*圖片*/
            "title": "電影導演吳永剛誕生",  /*事件標題*/
            "year": 1907  /*年份*/
        },
        {
            "day": 1,
            "des": "1902年11月1日 挪威作家格里格誕生   格里格,1902年11月1日生於卑爾根。挪威作家。   青年時代在奧斯陸和牛津求學,好旅行。1924年出版描寫海員生活的小說《航船在前進》。1926年至1927年在...",
            "id": 9010,
            "lunar": "壬寅年十月初二",
            "month": 11,
            "pic": "",
            "title": "挪威作家格里格誕生",
            "year": 1902
        },
        {
            "day": 1,
            "des": "1911年11月1日,清廷宣佈解散皇族內閣,任命袁世凱爲內閣總理大臣,要他趕快從前線回京,籌組“責任內閣”。11月13日,袁世凱抵達北京,16日組織新內閣,以梁郭彥爲外務大臣,趙秉鈞爲民政大臣,...",
            "id": 3577,
            "lunar": "辛亥年九月十一",
            "month": 11,
            "pic": "",
            "title": "袁世凱出任清朝內閣總理大臣",
            "year": 1911
        }
    ]
}

那麼從接口獲得的數據應該怎麼在我的 App 應用上得到應用呢?

  • 生成我們的 JavaBean(主要是屬性,其餘是get set 方法)
public class HistoryBean implements Serializable {


    private String reason;
    private int error_code;
    private List<ResultBean> result;

    public String getReason() {
        return reason;
    }

    public void setReason(String reason) {
        this.reason = reason;
    }

    public int getError_code() {
        return error_code;
    }

    public void setError_code(int error_code) {
        this.error_code = error_code;
    }

    public List<ResultBean> getResult() {
        return result;
    }

    public void setResult(List<ResultBean> result) {
        this.result = result;
    }

    public static class ResultBean implements Serializable{
        /**
         * _id : 16530420
         * title : 奧利弗·克倫威爾解散英國國會
         * pic : http://juheimg.oss-cn-hangzhou.aliyuncs.com/toh/201004/18/FA235154714.jpg
         * year : 1653
         * month : 4
         * day : 20
         * des : 在367年前的今天,1653年4月20日 (農曆三月廿三),奧利弗·克倫威爾解散英國國會。
         * lunar : 癸巳年三月廿三
         */

        private String _id;
        private String title;
        private String pic;
        private int year;
        private int month;
        private int day;
        private String des;
        private String lunar;

        public String get_id() {
            return _id;
        }

        public void set_id(String _id) {
            this._id = _id;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public String getPic() {
            return pic;
        }

        public void setPic(String pic) {
            this.pic = pic;
        }

        public int getYear() {
            return year;
        }

        public void setYear(int year) {
            this.year = year;
        }

        public int getMonth() {
            return month;
        }

        public void setMonth(int month) {
            this.month = month;
        }

        public int getDay() {
            return day;
        }

        public void setDay(int day) {
            this.day = day;
        }

        public String getDes() {
            return des;
        }

        public void setDes(String des) {
            this.des = des;
        }

        public String getLunar() {
            return lunar;
        }

        public void setLunar(String lunar) {
            this.lunar = lunar;
        }
    }
}
  • 其餘操作(Bean只是與json數據進行對應)

Json與對象之間的轉換

工具 : gson、Jackson 等等。
這裏以 spingMVC 中使用Jackson爲例

@RestController
public class UserController {

   @RequestMapping(value = "/json1")
   public String json1() throws JsonProcessingException {
       //創建一個jackson的對象映射器,用來解析數據
       ObjectMapper mapper = new ObjectMapper();
       //創建一個對象
       User user = new User("張三1號", 3, "男");
       //將我們的對象解析成爲json格式
       String str = mapper.writeValueAsString(user);
       //由於@ResponseBody註解,這裏會將str轉成json格式返回;十分方便
       return str;
  }
}

同理,處理Json數組:

@RequestMapping("/json2")
public String json2() throws JsonProcessingException {

   //創建一個jackson的對象映射器,用來解析數據
   ObjectMapper mapper = new ObjectMapper();
   //創建一個對象
   User user1 = new User("張三1號", 3, "男");
   User user2 = new User("張三2號", 3, "男");
   User user3 = new User("張三3號", 3, "男");
   User user4 = new User("張三4號", 3, "男");
   List<User> list = new ArrayList<User>();
   list.add(user1);
   list.add(user2);
   list.add(user3);
   list.add(user4);

   //將我們的對象解析成爲json格式
   String str = mapper.writeValueAsString(list);
   return str;
}

JSON 的其他應用領域

1. Web開發
JSON最開始被廣泛的應用於WEB應用的開發。不過目前JSON使用在JavaScript、Java、Node.js應用的情況比較多,PHP、C#等開發的WEB應用主要還是使用XML。

2. NoSQL數據庫
相對於傳統的關係型數據庫,一些基於文檔存儲的NoSQL非關係型數據庫選擇JSON作爲其數據存儲格式,比較出名的產品有:MongoDB、CouchDB、RavenDB等。

  • 舉例
{
     "firstName": "John",
     "lastName": "Smith",
     "sex": "male",
     "age": 25,
     "address": 
     {
         "streetAddress": "21 2nd Street",
         "city": "New York",
         "state": "NY",
         "postalCode": "10021"
     },
     "phoneNumber": 
     [
         {
           "type": "home",
           "number": "212 555-1234"
         },
         {
           "type": "fax",
           "number": "646 555-4567"
         }
     ]
 }

這種JSON格式也被Minecraft遊戲用來當作的部分數據存儲的格式:

[
     {
          "text": "This is the text",
          "color": "dark_red",
          "bold": "true",
          "strikethough": "true",
          "clickEvent":
               {
                    "action": "open_url",
                    "value": "zh.wikipedia.org"
               },
          "hoverEvent":
               {
                    "action": "show_text",
                    "value":
                    {
                         "extra": "something"
                    }
               }
     },
     {
          "translate": "item.dirt.name",
          "color": "blue",
          "italic": "true"
     }
]

3. 安全問題

XML和JSON的區別

JSON與XML最大的不同在於XML是一個完整的標記語言,而JSON不是。這使得XML在程序判讀上需要比較多的功夫。主要的原因在於XML的設計理念與JSON不同。XML利用標記語言的特性提供了絕佳的延展性(如XPath),在數據存儲,擴展及高級檢索方面具備對JSON的優勢,而JSON則由於比XML更加小巧,以及瀏覽器的內建快速解析支持,使得其更適用於網絡數據傳輸領域

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章