Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 国产精品www视频免费看,国产一区二区三区高清视频,日韩欧美在线中文字幕

          整合營銷服務(wù)商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          JavaScript中的JSON對象

          SON對象有兩個方法:stringify()、parse()。


          1、stringify(),將JavaScript對象序列化為JSON字符串


          語法格式:stringify(參數(shù)1,[[參數(shù)2],[參數(shù)3]])


          參數(shù)1:要被序列化的JavaScript對象

          參數(shù)2:數(shù)據(jù)過濾器或轉(zhuǎn)換函數(shù)

          如果是函數(shù),傳入的函數(shù)接收兩個參數(shù),屬性名和屬性值

          JSON.stringify(str,function(key,value){return.......})

          如果是數(shù)組,那么結(jié)果中將只包含數(shù)組中列出的屬性

          JSON.stringify(str,["name","age"])

          參數(shù)3:控制結(jié)果中的縮進和空白符

          如果是一個數(shù)值,則表示每個級別縮進的空格數(shù)(<=10個)

          JSON.stringify(str,["name","age"],4)

          如果是一個字符串,則這個字符串將被用作縮進字符(不再使用空格)(<=10個)

          JSON.stringify(str,["name","age"],"-")


          如果還是不能滿足對某些對象進行自定義序列化的需求,可以給對象定義toJSON方法,返回其自身的JSON數(shù)據(jù)格式

          var obj = {"name":"jack",toJSON:function(){....}}

          備注:

          1.1、序列化后的字符串不包含任何空格字符或縮進

          1.2、所有函數(shù)原型成員都會被忽略

          1.3、值為undefined的任何屬性都會被跳過


          2、parse(),將JSON字符串解析為原生JavaScript對象


          語法格式:parse(參數(shù)1,[參數(shù)2])


          參數(shù)1:要被解析的JSON字符串

          參數(shù)2:是一個函數(shù),傳入的函數(shù)接收兩個參數(shù),屬性名和屬性值

          JSON.parse(str,function(key,value){return.......})

          HP獲取數(shù)據(jù)庫中數(shù)據(jù)生成json, 中文亂碼問題的解決方案

          1.在代碼前段寫上

          header("Content-Type: text/html;charset=utf8");

          2.在connection建立以后寫上

          mysqli_query($connection, "SET NAMES utf8");

          ————至此就可以在PHP頁面中顯示中文了————-

          最后, 如果需要用到j(luò)son_encode, 那么需要注意最后一點

          $json_string = json_encode($result_row, JSON_UNESCAPED_UNICODE); //php5.4以上

          即在普通的json_encode中多加入一個參數(shù), 至此就全部完成啦~

          讓json更懂中文(JSON_UNESCAPED_UNICODE)

          <?php
          echo json_encode("中文", JSON_UNESCAPED_UNICODE); //需要5.4以上版本才能支持 unescaped_unicode: unicode轉(zhuǎn)義
          $data = array(
          0=>array('status'=>'1', 'method'=>'登陸', 'message'=>'成功',"url"=>"http://q.qlogo.cn/qqapp/1105737075/788B369AB26335DDDFB5E45199B95FDD/40"),
          1=>array('status'=>'2', 'method'=>'注銷', 'message'=>'成功',"url"=>"http://q.qlogo.cn/qqapp/1105737075/788B369AB26335DDDFB5E45199B95FDD/41"),
          );
          echo json_encode($data, JSON_UNESCAPED_UNICODE);

          輸出結(jié)果:

          [{"status":"1","method":"登陸","message":"成功","url":"http:\/\/q.qlogo.cn\/qqapp\/1105737075\/788B369AB26335DDDFB5E45199B95FDD\/40"},{"status":"2","method":"注銷","message":"成功","url":"http:\/\/q.qlogo.cn\/qqapp\/1105737075\/788B369AB26335DDDFB5E45199B95FDD\/41"}]

          注意: 這個參數(shù)只解決中文轉(zhuǎn)碼問題, url地址自動加上轉(zhuǎn)義字符, 并未解決。

          PHP5.4以上才支持JSON_UNESCAPED_UNICODE這個參數(shù), 此參數(shù)是讓中文字符在json_encode的時候不用轉(zhuǎn)義, 減少數(shù)據(jù)傳輸量。但在PHP5.3中, 就得自己寫個函數(shù)來實現(xiàn), 以下就是解決方法:

          /**
          * 對變量進行 JSON 編碼
          * @param mixed value 待編碼的 value ,除了resource 類型之外,可以為任何數(shù)據(jù)類型,該函數(shù)只能接受 UTF-8 編碼的數(shù)據(jù)
          * @return string 返回 value 值的 JSON 形式
          */
          function json_encode_ex($value)
          {
          if (version_compare(PHP_VERSION,'5.4.0','<')){
          $str = json_encode($value);
          $str = preg_replace_callback("#\\\u([0-9a-f]{4})#i",
          function($matchs){
          return iconv('UCS-2BE', 'UTF-8', pack('H4', $matchs[1]));
          },
          $str
          );
          return $str;
          }else{
          return json_encode($value, JSON_UNESCAPED_UNICODE);
          }
          }
          //使用方法
          $data = array(
          0=>array('status'=>'1', 'method'=>'登陸', 'message'=>'成功',"url"=>"http://q.qlogo.cn/qqapp/1105737075/788B369AB26335DDDFB5E45199B95FDD/40"),
          1=>array('status'=>'2', 'method'=>'注銷', 'message'=>'成功',"url"=>"http://q.qlogo.cn/qqapp/1105737075/788B369AB26335DDDFB5E45199B95FDD/41"),
          );
          echo json_encode_ex($data); //這個函數(shù)只解決中文轉(zhuǎn)碼問題, url地址自動加上轉(zhuǎn)義字符, 并未解決
          ?>

          輸出結(jié)果:

          設(shè)我們有一個復(fù)雜的對象,我們希望將其轉(zhuǎn)換為字符串,以通過網(wǎng)絡(luò)發(fā)送,或者只是為了在日志中輸出它。

          當(dāng)然,這樣的字符串應(yīng)該包含所有重要的屬性。

          我們可以像這樣實現(xiàn)轉(zhuǎn)換:

          let user = {
            name: "John",
            age: 30,
          
            toString() {
              return `{name: "${this.name}", age: ${this.age}}`;
            }
          };
          
          alert(user); // {name: "John", age: 30}

          ……但在開發(fā)過程中,會新增一些屬性,舊的屬性會被重命名和刪除。每次更新這種 toString 都會非常痛苦。我們可以嘗試遍歷其中的屬性,但是如果對象很復(fù)雜,并且在屬性中嵌套了對象呢?我們也需要對它們進行轉(zhuǎn)換。

          幸運的是,不需要編寫代碼來處理所有這些問題。這項任務(wù)已經(jīng)解決了。

          JSON.stringify

          JSON(JavaScript Object Notation)是表示值和對象的通用格式。在 RFC 4627 標準中有對其的描述。最初它是為 JavaScript 而創(chuàng)建的,但許多其他編程語言也有用于處理它的庫。因此,當(dāng)客戶端使用 JavaScript 而服務(wù)器端是使用 Ruby/PHP/Java 等語言編寫的時,使用 JSON 可以很容易地進行數(shù)據(jù)交換。

          JavaScript 提供了如下方法:

          • JSON.stringify 將對象轉(zhuǎn)換為 JSON。
          • JSON.parse 將 JSON 轉(zhuǎn)換回對象。

          例如,在這里我們 JSON.stringify 一個 student 對象:

          let student = {
            name: 'John',
            age: 30,
            isAdmin: false,
            courses: ['html', 'css', 'js'],
            wife: null
          };
          
          let json = JSON.stringify(student);
          
          alert(typeof json); // we've got a string!
          
          alert(json);
          /* JSON 編碼的對象:
          {
            "name": "John",
            "age": 30,
            "isAdmin": false,
            "courses": ["html", "css", "js"],
            "wife": null
          }
          */

          方法 JSON.stringify(student) 接收對象并將其轉(zhuǎn)換為字符串。

          得到的 json 字符串是一個被稱為 JSON 編碼(JSON-encoded)序列化(serialized)字符串化(stringified)編組化(marshalled) 的對象。我們現(xiàn)在已經(jīng)準備好通過有線發(fā)送它或?qū)⑵浞湃肫胀〝?shù)據(jù)存儲。

          請注意,JSON 編碼的對象與對象字面量有幾個重要的區(qū)別:

          • 字符串使用雙引號。JSON 中沒有單引號或反引號。所以 'John' 被轉(zhuǎn)換為 "John"。
          • 對象屬性名稱也是雙引號的。這是強制性的。所以 age:30 被轉(zhuǎn)換成 "age":30

          JSON.stringify 也可以應(yīng)用于原始(primitive)數(shù)據(jù)類型。

          JSON 支持以下數(shù)據(jù)類型:

          • Objects { ... }
          • Arrays [ ... ]
          • Primitives:strings,numbers,boolean values true/false,null

          例如:

          // 數(shù)字在 JSON 還是數(shù)字
          alert( JSON.stringify(1) ) // 1
          
          // 字符串在 JSON 中還是字符串,只是被雙引號擴起來
          alert( JSON.stringify('test') ) // "test"
          
          alert( JSON.stringify(true) ); // true
          
          alert( JSON.stringify([1, 2, 3]) ); // [1,2,3]

          JSON 是語言無關(guān)的純數(shù)據(jù)規(guī)范,因此一些特定于 JavaScript 的對象屬性會被 JSON.stringify 跳過。

          即:

          • 函數(shù)屬性(方法)。
          • Symbol 類型的屬性。
          • 存儲 undefined 的屬性。
          let user = {
            sayHi() { // 被忽略
              alert("Hello");
            },
            [Symbol("id")]: 123, // 被忽略
            something: undefined // 被忽略
          };
          
          alert( JSON.stringify(user) ); // {}(空對象)

          通常這很好。如果這不是我們想要的方式,那么我們很快就會看到如何自定義轉(zhuǎn)換方式。

          最棒的是支持嵌套對象轉(zhuǎn)換,并且可以自動對其進行轉(zhuǎn)換。

          例如:

          let meetup = {
            title: "Conference",
            room: {
              number: 23,
              participants: ["john", "ann"]
            }
          };
          
          alert( JSON.stringify(meetup) );
          /* 整個解構(gòu)都被字符串化了
          {
            "title":"Conference",
            "room":{"number":23,"participants":["john","ann"]},
          }
          */

          重要的限制:不得有循環(huán)引用。

          例如:

          let room = {
            number: 23
          };
          
          let meetup = {
            title: "Conference",
            participants: ["john", "ann"]
          };
          
          meetup.place = room;       // meetup 引用了 room
          room.occupiedBy = meetup; // room 引用了 meetup
          
          JSON.stringify(meetup); // Error: Converting circular structure to JSON

          在這里,轉(zhuǎn)換失敗了,因為循環(huán)引用:room.occupiedBy 引用了 meetup,meetup.place 引用了 room

          排除和轉(zhuǎn)換:replacer

          JSON.stringify 的完整語法是:

          let json = JSON.stringify(value[, replacer, space])

          value要編碼的值。replacer要編碼的屬性數(shù)組或映射函數(shù) function(key, value)。space用于格式化的空格數(shù)量

          大部分情況,JSON.stringify 僅與第一個參數(shù)一起使用。但是,如果我們需要微調(diào)替換過程,比如過濾掉循環(huán)引用,我們可以使用 JSON.stringify 的第二個參數(shù)。

          如果我們傳遞一個屬性數(shù)組給它,那么只有這些屬性會被編碼。

          例如:

          let room = {
            number: 23
          };
          
          let meetup = {
            title: "Conference",
            participants: [{name: "John"}, {name: "Alice"}],
            place: room // meetup 引用了 room
          };
          
          room.occupiedBy = meetup; // room 引用了 meetup
          
          alert( JSON.stringify(meetup, ['title', 'participants']) );
          // {"title":"Conference","participants":[{},{}]}

          這里我們可能過于嚴格了。屬性列表應(yīng)用于了整個對象結(jié)構(gòu)。所以 participants 是空的,因為 name 不在列表中。

          讓我們包含除了會導(dǎo)致循環(huán)引用的 room.occupiedBy 之外的所有屬性:

          let room = {
            number: 23
          };
          
          let meetup = {
            title: "Conference",
            participants: [{name: "John"}, {name: "Alice"}],
            place: room // meetup 引用了 room
          };
          
          room.occupiedBy = meetup; // room 引用了 meetup
          
          alert( JSON.stringify(meetup, ['title', 'participants', 'place', 'name', 'number']) );
          /*
          {
            "title":"Conference",
            "participants":[{"name":"John"},{"name":"Alice"}],
            "place":{"number":23}
          }
          */

          現(xiàn)在,除 occupiedBy 以外的所有內(nèi)容都被序列化了。但是屬性的列表太長了。

          幸運的是,我們可以使用一個函數(shù)代替數(shù)組作為 replacer。

          該函數(shù)會為每個 (key,value) 對調(diào)用并返回“已替換”的值,該值將替換原有的值。如果值被跳過了,則為 undefined

          在我們的例子中,我們可以為 occupiedBy 以外的所有內(nèi)容按原樣返回 value。為了 occupiedBy,下面的代碼返回 undefined

          let room = {
            number: 23
          };
          
          let meetup = {
            title: "Conference",
            participants: [{name: "John"}, {name: "Alice"}],
            place: room // meetup 引用了 room
          };
          
          room.occupiedBy = meetup; // room 引用了 meetup
          
          alert( JSON.stringify(meetup, function replacer(key, value) {
            alert(`${key}: ${value}`);
            return (key == 'occupiedBy') ? undefined : value;
          }));
          
          /* key:value pairs that come to replacer:
          :             [object Object]
          title:        Conference
          participants: [object Object],[object Object]
          0:            [object Object]
          name:         John
          1:            [object Object]
          name:         Alice
          place:        [object Object]
          number:       23
          */

          請注意 replacer 函數(shù)會獲取每個鍵/值對,包括嵌套對象和數(shù)組項。它被遞歸地應(yīng)用。replacer 中的 this 的值是包含當(dāng)前屬性的對象。

          第一個調(diào)用很特別。它是使用特殊的“包裝對象”制作的:{"": meetup}。換句話說,第一個 (key, value) 對的鍵是空的,并且該值是整個目標對象。這就是上面的示例中第一行是 ":[object Object]" 的原因。

          這個理念是為了給 replacer 提供盡可能多的功能:如果有必要,它有機會分析并替換/跳過整個對象。

          格式化:space

          JSON.stringify(value, replacer, spaces) 的第三個參數(shù)是用于優(yōu)化格式的空格數(shù)量。

          以前,所有字符串化的對象都沒有縮進和額外的空格。如果我們想通過網(wǎng)絡(luò)發(fā)送一個對象,那就沒什么問題。space 參數(shù)專門用于調(diào)整出更美觀的輸出。

          這里的 space = 2 告訴 JavaScript 在多行中顯示嵌套的對象,對象內(nèi)部縮緊 2 個空格:

          let user = {
            name: "John",
            age: 25,
            roles: {
              isAdmin: false,
              isEditor: true
            }
          };
          
          alert(JSON.stringify(user, null, 2));
          /* 兩個空格的縮進:
          {
            "name": "John",
            "age": 25,
            "roles": {
              "isAdmin": false,
              "isEditor": true
            }
          }
          */
          
          /* 對于 JSON.stringify(user, null, 4) 的結(jié)果會有更多縮進:
          {
              "name": "John",
              "age": 25,
              "roles": {
                  "isAdmin": false,
                  "isEditor": true
              }
          }
          */

          spaces 參數(shù)僅用于日志記錄和美化輸出。

          自定義 “toJSON”

          toString 進行字符串轉(zhuǎn)換,對象也可以提供 toJSON 方法來進行 JSON 轉(zhuǎn)換。如果可用,JSON.stringify 會自動調(diào)用它。

          例如:

          let room = {
            number: 23
          };
          
          let meetup = {
            title: "Conference",
            date: new Date(Date.UTC(2017, 0, 1)),
            room
          };
          
          alert( JSON.stringify(meetup) );
          /*
            {
              "title":"Conference",
              "date":"2017-01-01T00:00:00.000Z",  // (1)
              "room": {"number":23}               // (2)
            }
          */

          在這兒我們可以看到 date (1) 變成了一個字符串。這是因為所有日期都有一個內(nèi)置的 toJSON 方法來返回這種類型的字符串。

          現(xiàn)在讓我們?yōu)閷ο?room 添加一個自定義的 toJSON

          let room = {
            number: 23,
            toJSON() {
              return this.number;
            }
          };
          
          let meetup = {
            title: "Conference",
            room
          };
          
          alert( JSON.stringify(room) ); // 23
          
          alert( JSON.stringify(meetup) );
          /*
            {
              "title":"Conference",
              "room": 23
            }
          */

          正如我們所看到的,toJSON 既可以用于直接調(diào)用 JSON.stringify(room) 也可以用于當(dāng) room 嵌套在另一個編碼對象中時。

          JSON.parse

          要解碼 JSON 字符串,我們需要另一個方法 JSON.parse。

          語法:

          let value = JSON.parse(str, [reviver]);

          str要解析的 JSON 字符串。reviver可選的函數(shù) function(key,value),該函數(shù)將為每個 (key, value) 對調(diào)用,并可以對值進行轉(zhuǎn)換。

          例如:

          // 字符串化數(shù)組
          let numbers = "[0, 1, 2, 3]";
          
          numbers = JSON.parse(numbers);
          
          alert( numbers[1] ); // 1

          對于嵌套對象:

          let userData = '{ "name": "John", "age": 35, "isAdmin": false, "friends": [0,1,2,3] }';
          
          let user = JSON.parse(userData);
          
          alert( user.friends[1] ); // 1

          JSON 可能會非常復(fù)雜,對象和數(shù)組可以包含其他對象和數(shù)組。但是它們必須遵循相同的 JSON 格式。

          以下是手寫 JSON 時的典型錯誤(有時我們必須出于調(diào)試目的編寫它):

          let json = `{
            name: "John",                     // 錯誤:屬性名沒有雙引號
            "surname": 'Smith',               // 錯誤:值使用的是單引號(必須使用雙引號)
            'isAdmin': false                  // 錯誤:鍵使用的是單引號(必須使用雙引號)
            "birthday": new Date(2000, 2, 3), // 錯誤:不允許使用 "new",只能是裸值
            "friends": [0,1,2,3]              // 這個沒問題
          }`;

          此外,JSON 不支持注釋。向 JSON 添加注釋無效。

          還有另一種名為 JSON5 的格式,它允許未加引號的鍵,也允許注釋等。但這是一個獨立的庫,不在語言的規(guī)范中。

          常規(guī)的 JSON 格式嚴格,并不是因為它的開發(fā)者很懶,而是為了實現(xiàn)簡單,可靠且快速地實現(xiàn)解析算法。

          使用 reviver

          想象一下,我們從服務(wù)器上獲得了一個字符串化的 meetup 對象。

          它看起來像這樣:

          // title: (meetup title), date: (meetup date)
          let str = '{"title":"Conference","date":"2017-11-30T12:00:00.000Z"}';

          ……現(xiàn)在我們需要對它進行 反序列(deserialize),把它轉(zhuǎn)換回 JavaScript 對象。

          讓我們通過調(diào)用 JSON.parse 來完成:

          let str = '{"title":"Conference","date":"2017-11-30T12:00:00.000Z"}';
          
          let meetup = JSON.parse(str);
          
          alert( meetup.date.getDate() ); // Error!

          啊!報錯了!

          meetup.date 的值是一個字符串,而不是 Date 對象。JSON.parse 怎么知道應(yīng)該將字符串轉(zhuǎn)換為 Date 呢?

          讓我們將 reviver 函數(shù)傳遞給 JSON.parse 作為第二個參數(shù),該函數(shù)按照“原樣”返回所有值,但是 date 會變成 Date

          let str = '{"title":"Conference","date":"2017-11-30T12:00:00.000Z"}';
          
          let meetup = JSON.parse(str, function(key, value) {
            if (key == 'date') return new Date(value);
            return value;
          });
          
          alert( meetup.date.getDate() ); // 現(xiàn)在正常運行了!

          順便說一下,這也適用于嵌套對象:

          let schedule = `{
            "meetups": [
              {"title":"Conference","date":"2017-11-30T12:00:00.000Z"},
              {"title":"Birthday","date":"2017-04-18T12:00:00.000Z"}
            ]
          }`;
          
          schedule = JSON.parse(schedule, function(key, value) {
            if (key == 'date') return new Date(value);
            return value;
          });
          
          alert( schedule.meetups[1].date.getDate() ); // 正常運行了!

          總結(jié)

          • JSON 是一種數(shù)據(jù)格式,具有自己的獨立標準和大多數(shù)編程語言的庫。
          • JSON 支持 object,array,string,number,boolean 和 null。
          • JavaScript 提供序列化(serialize)成 JSON 的方法 JSON.stringify 和解析 JSON 的方法 JSON.parse。
          • 這兩種方法都支持用于智能讀/寫的轉(zhuǎn)換函數(shù)。
          • 如果一個對象具有 toJSON,那么它會被 JSON.stringify 調(diào)用。

          主站蜘蛛池模板: 国产人妖视频一区在线观看| 色婷婷AV一区二区三区浪潮| 久久久久久一区国产精品| 国产一区在线视频| 色窝窝免费一区二区三区| 一区二区三区四区视频在线| 一区二区传媒有限公司| 久久久精品人妻一区二区三区| 在线日韩麻豆一区| 高清精品一区二区三区一区| 午夜DV内射一区二区| 国产综合无码一区二区辣椒 | 国产99久久精品一区二区| 视频一区二区中文字幕| 国产一区二区三区樱花动漫| 女女同性一区二区三区四区| 69久久精品无码一区二区| 人妻AV一区二区三区精品| 日本中文字幕一区二区有码在线| 国产精品成人国产乱一区| 日本一区二区三区中文字幕| 一区视频在线播放| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 天堂一区二区三区在线观看| 国产精品毛片一区二区三区| 三上悠亚日韩精品一区在线| 久久无码人妻精品一区二区三区| 麻豆AV天堂一区二区香蕉 | 无码精品一区二区三区免费视频| 中文国产成人精品久久一区| 久久无码精品一区二区三区| 精品成人av一区二区三区| 日韩精品无码人妻一区二区三区| 免费萌白酱国产一区二区| 精品免费AV一区二区三区| 亚洲片一区二区三区| 久久久精品一区二区三区| 日韩精品无码中文字幕一区二区 | 国产一区在线播放| 无码AV动漫精品一区二区免费| 国产高清精品一区|