1. 程式人生 > >JSON詳解以及stringfy( )和parse( )的使用

JSON詳解以及stringfy( )和parse( )的使用

前言:最早,XML是是網際網路上傳輸結構化資料的事實標準,但是XML使用繁瑣,為了解決這個問題,JSON應運而生。JSON是JavaScript的一個嚴格子集,利用了 JavaScript中的一些模式來表示結構化資料。 JSON 並不從屬於 JavaScript,而且,並不是只有 JavaScript 才使用 JSON,畢竟 JSON 只是一種資料格式。很多程式語言都有針對 JSON 的解析器和序列化器。

JSON語法

JSON 的語法可以表示以下三種類型的值:
簡單值:使用與 JavaScript 相同的語法,可以在 JSON 中表示字串、數值、布林值和 null。但 JSON 不支援 JavaScript 中的特殊值 undefined。
例1:

5  //JSON表示數值5的方式
"hello json"  //JSON表示字串的方式,必須使用雙引號

物件:物件作為一種複雜資料型別,表示的是一組無序的鍵值對。而每個鍵值對中的值可以是簡單值,也可以是複雜資料型別的值。
例2:

//以下是JavaScript中定義物件的兩種格式
var person = {
    name: "Nicholas",
    age: 29
};
var object = {
    "name": "Nicholas",
    "age": 29
};
//以下是JSON表示以上物件的方式
{
    "name": "Nicholas",
    "age"
: 29 }

與 JavaScript 的物件字面量相比, JSON 物件有兩個地方不一樣
1.沒有宣告變數(JSON 中沒有變數的概念);
2.沒有末尾的分號(因為這不是 JavaScript 語句,所以不需要分號)。
陣列:陣列也是一種複雜資料型別,表示一組有序的值的列表,可以通過數值索引來訪問其中的值。陣列的值也可以是任意型別——簡單值、物件或陣列。
例3:

//以下是JavaScript中定義陣列的方式
var values = [25, "hi", true];
//以下是JSON中表示以上陣列的方式
[25, "hi", true]
//也可以將陣列和物件結合表示更加複雜的資料集合
[ { "title": "Professional JavaScript", "authors": [ "Nicholas C. Zakas" ] }, { "title": "Professional JavaScript", "authors": [ "Nicholas C. Zakas" ] }, { "title": "Professional Ajax", "authors": [ "Nicholas C. Zakas", "Jeremy McPeak", "Joe Fawcett" ] } ]

JSON 不支援變數、函式或物件例項,它就是一種表示結構化資料的格式。

解析和序列化

JSON 物件有兩個方法: stringify()和 parse()。這兩個方法分別用於把JavaScript 物件序列化為 JSON 字串和把 JSON 字串解析為原生 JavaScript 值。
例4:

var book = {
    title: "Professional JavaScript",
    authors: [
    "Nicholas"
    ],
    edition: 3,
    year: 2011
};
var jsonText = JSON.stringify(book);

//jsonText:
//{"title":"Professional JavaScript","authors":["Nicholas"],"edition":3,
//"year":2011}
//注:JSON中沒有undefined型別,因此JavaScript物件中值為undefined的任何屬性會跳過

var bookCopy = JSON.parse(jsonText);
//雖然 book 與 bookCopy 具有相同的屬性,但它們是兩個獨立的、沒有任何關係的物件。

JSON.stringify()

stringify()可以接收三個引數:第一個是要序列化的JavaScript物件;還有兩個引數用於指定以不同的方式序列化 JavaScript 物件,第一個引數是個過濾器,可以是一個數組,也可
以是一個函式;第二個引數是一個選項,表示是否在 JSON 字串中保留縮排。
例5:第二個引數為陣列

var book = {
    "title": "Professional JavaScript",
    "authors": [
    "Nicholas C. Zakas"
    ],
    edition: 3,
    year: 2011
};
var jsonText = JSON.stringify(book, ["title", "edition"]);
//jsonText :
//{"title":"Professional JavaScript","edition":3}

例6:第二個引數為函式

var book = {
    "title": "Professional JavaScript",
    "authors": [
    "Nicholas C. Zakas"
    ],
    edition: 3,
    year: 2011
};
var jsonText = JSON.stringify(book, function(key, value){
    switch(key){
    case "authors":
    return value.join(",")
    case "year":
    return 5000;
    case "edition":
    return undefined;
    default:
    return value;
}
});
//jsonText :
//{"title":"Professional JavaScript","authors":"Nicholas C. Zakas","year":5000}
//注:如果函式返回了undefined,那麼相應的屬性會被忽略

例7:第三個引數,如果是數字,則表示縮排數(大於10的會自動轉換為10),如果是字串,則表示用該字串代替縮排空格(大於10個字元長度的只取前十個字元)

var book = {
    "title": "Professional JavaScript",
    "authors": [
    "Nicholas C. Zakas"
    ],
    edition: 3,
    year: 2011
    };
var jsonText = JSON.stringify(book, null, "--");
//jsonText :
/*{
--"title": "Professional JavaScript",
--"authors": [
----"Nicholas C. Zakas"
--],
--"edition": 3,
--"year": 2011
}*/

toJSON()方法

有時候, JSON.stringify()還是不能滿足對某些物件進行自定義序列化的需求。在這些情況下,可以給物件定義 toJSON()方法,返回其自身的 JSON 資料格式。原生 Date 物件有一個 toJSON()方法,能夠將 JavaScript的 Date 物件自動轉換成 ISO 8601日期字串(與在 Date 物件上呼叫 toISOString()的結果完全一樣)。
例8:

var book = {
    "title": "Professional JavaScript",
    "authors": [
    "Nicholas C. Zakas"
    ],
    edition: 3,
    year: 2011,
    toJSON: function(){
        return this.title;
    }
};
var jsonText = JSON.stringify(book);
//jsonText:"Professional JavaScript"
var parseText=JSON.parse(jsonText);
//parseText:Professional JavaScript

序列化的內部順序

假設把一個物件傳入 JSON.stringify(),序列化該物件的順序如下:
(1) 如果存在 toJSON()方法而且能通過它取得有效的值,則呼叫該方法。否則,返回物件本身;
(2) 如果提供了第二個引數,應用這個函式過濾器。傳入函式過濾器的值是第(1)步返回的值;
(3) 對第(2)步返回的每個值進行相應的序列化;
(4) 如果提供了第三個引數,執行相應的格式化。

相關推薦

JSON以及stringfy( )parse( )的使用

前言:最早,XML是是網際網路上傳輸結構化資料的事實標準,但是XML使用繁瑣,為了解決這個問題,JSON應運而生。JSON是JavaScript的一個嚴格子集,利用了 JavaScript中的一些模式來表示結構化資料。 JSON 並不從屬於 JavaScript

懶漢模式餓漢模式以及他們的改進

下一步 例子 理解 創建對象 進行 有一個 這就是 cnblogs 多人 提到單例模式的話相信很多人都不會陌生,一般初級程序員也知道懶漢模式和餓漢模式。 那麽什麽是單例模式呢?我個人低的理解就是當用這個類的對象的時候就只能創建同一個對象。是你,是你,還是你! 而在單例模式中

BFSDFS以及java實現(轉載)

作者: Leo-Yang 原文都先發布在作者個人部落格: http://www.leoyang.net/ 本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利. 前言

RabbitMQ以及SpringBoot整合

各訊息元件的適用場景 ActiveMQ ActiveMQ 是一款比較早期的訊息元件,由Apache開源出來的,它能滿足吞吐量一般的業務場景,但是對於高併發場景,效能較差。 Kafka Kafka追求高吞吐量的特性,它一開始使用於日誌的收集。缺點是訊息可靠性支援

微信小程式setData()方法的以及對陣列/json操作

一、setData()方法: 1、引數接受一個物件,以key,value的形式表示; 2、引數和變數名稱一致,可用一個值代替(es6新語法特性) 如上圖所示,在this.data中設定ceshi這條資料,在方法中,我們定義ceshi變數讓其等於that.data.ce

Spring學習(1):控制反轉(IoC)依賴注入(DI)的以及註解(annotation)開發入門案例

前言 以往的java學習中,我們要想得到一個物件,就把它new出來。如:Apple apple = new Apple(); 在一些複雜的系統中,一個物件A可能依賴於物件B,C等(程式碼表現為A類持有B,C類的物件作為A類的屬性)。以往來說,我們想要使用B,

malloc函式以及new的區別

今天偶然看到一個面試經驗中提到malloc和new的區別,突然發現自己雖然兩個都用過,但是至於區別,真的不是很明白 ,所以就仔細查了一些資料,算是對這個點徹底地瞭解一下,現在把我所學到的記錄下來。 malloc與free是C++/C語言的標準庫函式,new/d

BFSDFS以及java實現

前言 圖在演算法世界中的重要地位是不言而喻的,曾經看到一篇Google的工程師寫的一篇《Get that job at Google!》文章中說到面試官問的問題中幾乎有一半的問題都可以用圖的方法去解決。由此也可以看出圖確實適用範圍確實很廣。 圖的表示 閒話不多說,首先要

TCP三次握手四次揮手以及原因

三次握手 三次握手(three times handshake;three-way handshake)所謂的“三次握手”即對每次傳送的資料量是怎樣跟蹤進行協商使資料段的傳送和接收同步,根據所接收到的資料量而確定的資料確認數及資料傳送、接收完畢後何時撤消聯絡,

python 序列型別以及list(列表) tuple(元組) 以及range的用法

參考: #################################################################### 序列:成員是有序排列,可以通過下標偏移量訪問到它的一個或多個成員 在python中有六種內建的序列:列表、元素、字串、

TCP通訊過程以及tcp長連線短連線

1. TCP連線 當網路通訊時採用TCP協議時,在真正的讀寫操作之前,server與client之間必須建立一個連線,當讀寫操作完成後,雙方不再需要這個連線 時它們可以釋放這個連線,連線的建立是需要三次握手的,而釋放則需要4次揮手,所以說每個連線的建立都是需要

Android Studio——android中的檔案操作以及內部儲存外部儲存

原文連結:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2013/0923/1557.html 其實安卓檔案的操作和java在pc環境下的操作並無二致,之所以需要單獨講解是因為安卓系統提供了不同於

Java迭代器(轉)(iterator以及for迴圈的區別)

迭代器是一種模式,它可以使得對於序列型別的資料結構的遍歷行為與被遍歷的物件分離,即我們無需關心該序列的底層結構是什麼樣子的。只要拿到這個物件,使用迭代器就可以遍歷這個物件的內部.1.IteratorJava提供一個專門的迭代器«interface»Iterator,我們可以對某個序列實現該interface,

go語言中beego框架資料輸出返回json

beego框架中資料輸出 1.直接輸出字串 beego.Controller.Ctx.WriteString(“字串”) func (ctx *Context) WriteString(content string) { ctx.ResponseWrit

dnsmasq以及在openstack容器中的使用

dnsmasq簡介 瞭解Dnsmasq,還是從研究openstack neutron網路開始的,在openstack的網路中,dnsmasq為指定網路提供dhcp和dns功能,後臺起的程序如下: dnsmasq --no-hosts --no-resolv --stric

Java迭代器(iterator以及for迴圈的區別)

前言:        迭代器是一種模式、詳細可見其設計模式,可以使得序列型別的資料結構的遍歷行為與被遍歷的物件分離,即我們無需關心該序列的底層結構是什麼樣子的。只要拿到這個物件,使用迭代器就可以遍歷這個物件的內部。Iterable:實現這個介面的集合物件支援迭代,是可以迭代的

代理模式(靜態代理動態代理的區別以及聯系)

sys 事務處理 getname 沒有 面向接口編程 簡單 關註 不知道 正是 原文鏈接:https://www.cnblogs.com/takumicx/p/9285230.html 1. 前言 代理模式可以說是生活中處處可見。比如說在攜程上定火車票,攜程在這裏就起到

箭頭函式普通函式的區別以及箭頭函式的注意事項、不適用場景

箭頭函式是ES6的API,相信很多人都知道,因為其語法上相對於普通函式更簡潔,深受大家的喜愛。就是這種我們日常開發中一直在使用的A

JS中JSON

名稱 完全 rip json詳解 core 兼容 json字符串 之間 org JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式,采用完全獨立於語言的文本格式,是理想的數據交換格式。同時,JSON是 JavaScript 原生格式

筆記:MyBatis Mapper XML文件 - 映射參數

gin server 頂級 ctp columns ref acl 目標 對象傳遞 MyBatis 的真正強大在於它的映射語句,也是它的魔力所在。由於它的異常強大,映射器的 XML 文件就顯得相對簡單。如果拿它跟具有相同功能的 JDBC 代碼進行對比,你會立即發現省掉了將近