摘要:張三屬性名必須使用雙引號不能使用十六進制值張三不能使用張三屬性值不能使用函數和日期對象注意,空數組和空對象都是合法的值。三張三張張三現在,為這個對象加上方法。
JSON 格式
JSON 對象
JSON.stringify()
基本用法
第二個參數 用于過濾 數組或者函數
第三個參數 用于放在屬性開頭 增加可讀性
參數對象的 toJSON 方法
JSON.parse()
1.JSON 格式
復合類型的值只能是數組或對象,不能是函數、正則表達式對象、日期對象。
原始類型的值只有四種:字符串、數值(必須以十進制表示)、布爾值和null(不能使用NaN, Infinity, -Infinity和undefined)。
字符串必須使用雙引號表示
對象的鍵名必須放在雙引號里面。
數組或對象最后一個成員的后面,不能加逗號。
以下都是合法的 JSON。
["one", "two", "three"]
{ "one": 1, "two": 2, "three": 3 }
{"names": ["張三", "李四"] }
[ { "name": "張三"}, {"name": "李四"} ]
以下都是不合法的 JSON。
{ name: "張三", "age": 32 } // 屬性名必須使用雙引號
[32, 64, 128, 0xFFF] // 不能使用十六進制值
{ "name": "張三", "age": undefined } // 不能使用 undefined
{ "name": "張三",
"birthday": new Date("Fri, 26 Aug 2011 07:13:10 GMT"),
"getName": function () {
return this.name;
}
} // 屬性值不能使用函數和日期對象
注意,null、空數組和空對象都是合法的 JSON 值。
2.JSON 對象
用來處理 JSON 格式數據。它有兩個靜態方法:JSON.stringify()和JSON.parse()
3.JSON.stringify()
JSON.stringify方法用于將一個值轉為 JSON 字符串。該字符串符合 JSON 格式,并且可以被JSON.parse方法還原。
JSON.stringify("abc") // ""abc""
JSON.stringify(1) // "1"
JSON.stringify(false) // "false"
JSON.stringify([]) // "[]"
JSON.stringify({}) // "{}"
JSON.stringify([1, "false", false])
// "[1,"false",false]"
JSON.stringify({ name: "張三" })
// "{"name":"張三"}"
對于原始類型的字符串,轉換結果會帶雙引號。
JSON.stringify("foo") === "foo" // false
JSON.stringify("foo") === ""foo"" // true
3.基本用法
3.1過濾
3.1.1如果對象的屬性是undefined、函數或 XML 對象,該屬性會被JSON.stringify過濾。
var obj = {
a: undefined,
b: function () {}
};
JSON.stringify(obj) // "{}"
3.1.2如果數組的成員是undefined、函數或 XML 對象,則這些值被轉成null。
var arr = [undefined, function () {}];
JSON.stringify(arr) // "[null,null]"
3.1.3正則對象會被轉成空對象。
JSON.stringify(/foo/) // "{}"
3.1.4JSON.stringify方法會忽略對象的不可遍歷的屬性。
var obj = {};
Object.defineProperties(obj, {
"foo": {
value: 1, enumerable: true
},
"bar": {
value: 2, enumerable: false
}
});
JSON.stringify(obj); // "{"foo":1}"
上面代碼中,bar是obj對象的不可遍歷屬性,JSON.stringify方法會忽略這個屬性
3.2第二個參數
3.2.1為數組 用于篩選返回的屬性,對對象有用,對數組沒用
JSON.stringify(["a", "b"], ["0"])
// "["a","b"]"
JSON.stringify({0: "a", 1: "b"}, ["0"])
// "{"0":"a"}"
3.2.2函數,用來更改JSON.stringify的返回值。
function f(key, value) {
if (typeof value === "number") {
value = 2 * value;
}
return value;
}
JSON.stringify({ a: 1, b: 2 }, f)
// "{"a": 2,"b": 4}"
這個處理函數是遞歸處理所有的鍵。
var o = {a: {b: 1}};
function f(key, value) {
console.log("["+ key +"]:" + value);
return value;
}
JSON.stringify(o, f)
// []:[object Object]
// [a]:[object Object]
// [b]:1
// "{"a":{"b":1}}"
上面代碼中,對象o一共會被f函數處理三次,最后那行是JSON.stringify的輸出。第一次鍵名為空,鍵值是整個對象o;第二次鍵名為a,鍵值是{b: 1};第三次鍵名為b,鍵值為1。
遞歸處理中,每一次處理的對象,都是前一次返回的值。
var o = {a: 1};
function f(key, value) {
if (typeof value === "object") {
return {b: 2};
}
return value * 2;
}
JSON.stringify(o, f)
// "{"b": 4}"
上面代碼中,f函數修改了對象o,接著JSON.stringify方法就遞歸處理修改后的對象o
如果處理函數返回undefined或沒有返回值,則該屬性會被忽略。
function f(key, value) {
if (typeof(value) === "string") {
return undefined;
}
return value;
}
JSON.stringify({ a: "abc", b: 123 }, f)
// "{"b": 123}"
上面代碼中,a屬性經過處理后,返回undefined,于是該屬性被忽略了。
3.3第三個參數
JSON.stringify還可以接受第三個參數,用于增加返回的 JSON 字符串的可讀性。如果是數字,表示每個屬性前面添加的空格(最多不超過10個);如果是字符串(不超過10個字符),則該字符串會添加在每行前面。
JSON.stringify({ p1: 1, p2: 2 }, null, 2);
/*
"{
"p1": 1,
"p2": 2
}"
*/
JSON.stringify({ p1:1, p2:2 }, null, "|-");
/*
"{
|-"p1": 1,
|-"p2": 2
}"
*/
4.參數對象的 toJSON 方法
如果參數對象有自定義的toJSON方法,那么JSON.stringify會使用這個方法的返回值作為參數,而忽略原對象的其他屬性。
下面是一個普通的對象。
var user = {
firstName: "三",
lastName: "張",
get fullName(){
return this.lastName + this.firstName;
}
};
JSON.stringify(user)
// "{"firstName":"三","lastName":"張","fullName":"張三"}"
現在,為這個對象加上toJSON方法。
var user = {
firstName: "三",
lastName: "張",
get fullName(){
return this.lastName + this.firstName;
},
toJSON: function () {
return { name: this.lastName + this.firstName };
}
};
JSON.stringify(user)
// "{"name":"張三"}"
上面代碼中,JSON.stringify發現參數對象有toJSON方法,就直接使用這個方法的返回值作為參數,而忽略原對象的其他參數。
Date對象就有一個自己的toJSON方法。
var date = new Date("2015-01-01");
date.toJSON() // "2015-01-01T00:00:00.000Z"
JSON.stringify(date) // ""2015-01-01T00:00:00.000Z""
上面代碼中,JSON.stringify發現處理的是Date對象實例,就會調用這個實例對象的toJSON方法,將該方法的返回值作為參數。
toJSON方法的一個應用是,將正則對象自動轉為字符串。因為JSON.stringify默認不能轉換正則對象,但是設置了toJSON方法以后,就可以轉換正則對象了。
var obj = {
reg: /foo/
};
// 不設置 toJSON 方法時
JSON.stringify(obj) // "{"reg":{}}"
// 設置 toJSON 方法時
RegExp.prototype.toJSON = RegExp.prototype.toString;
JSON.stringify(/foo/) // ""/foo/""
上面代碼在正則對象的原型上面部署了toJSON()方法,將其指向toString()方法,因此轉換成 JSON 格式時,正則對象就先調用toJSON()方法轉為字符串,然后再被JSON.stringify()方法處理
5.JSON.parse()
JSON.parse方法用于將 JSON 字符串轉換成對應的值。
JSON.parse("{}") // {}
JSON.parse("true") // true
JSON.parse(""foo"") // "foo"
JSON.parse("[1, 5, "false"]") // [1, 5, "false"]
JSON.parse("null") // null
var o = JSON.parse("{"name": "張三"}");
o.name // 張三
如果傳入的字符串不是有效的 JSON 格式,JSON.parse方法將報錯。
JSON.parse(""String"") // illegal single quotes
// SyntaxError: Unexpected token ILLEGAL
上面代碼中,雙引號字符串中是一個單引號字符串,因為單引號字符串不符合 JSON 格式,所以報錯。
為了處理解析錯誤,可以將JSON.parse方法放在try...catch代碼塊中。
try {
JSON.parse(""String"");
} catch(e) {
console.log("parsing error");
}
JSON.parse方法可以接受一個處理函數,作為第二個參數,用法與JSON.stringify方法類似。
function f(key, value) {
if (key === "a") {
return value + 10;
}
return value;
}
JSON.parse("{"a": 1, "b": 2}", f)
// {a: 11, b: 2}
上面代碼中,JSON.parse的第二個參數是一個函數,如果鍵名是a,該函數會將鍵值加上10。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/105918.html
摘要:,指的對象表示法,它本身是個字符串,是一種數據交換格式,并非對象。字符串必須使用雙引號表示,不能使用單引號。數組或對象最后一個成員的后面,不能有逗號。不合法的會在解析成對象時,出現錯誤。替代方法對象下雖然提供了完整的字符串和對象的轉換方法。 JSON(JavaScript Object Notation),指JavaScript的對象表示法,它本身是個字符串,是一種數據交換格式,并非對...
摘要:系列目錄復習資料資料整理個人整理重溫基礎篇重溫基礎對象介紹本章節復習的是中的關于對象相關知識。概念概念有三點全稱對象表示法。對象沒有分號,而對象有。序列化對象時,所有函數及原型成員都會被忽略,不體現在結果上。 本文是 重溫基礎 系列文章的第十六篇。今日感受:靜。 系列目錄: 【復習資料】ES6/ES7/ES8/ES9資料整理(個人整理) 【重溫基礎】1-14篇 【重溫基礎】15...
摘要:更多資料如果你想了解更多關于的資料,下面的連接對你絕對有用關于本文本文轉自大叔的深入理解系列。深入理解系列文章,包括了原創,翻譯,轉載,整理等各類型文章,原文是大叔的一個非常不錯的專題,現將其重新整理發布。 前言 寫這篇文章的目的是經常看到開發人員說:把字符串轉化為JSON對象,把JSON對象轉化成字符串等類似的話題,所以把之前收藏的一篇老外的文章整理翻譯了一下,供大家討論,如有錯誤,...
摘要:獨立于語言和平臺,解析器和庫支持許多不同的編程語言。數據轉換數據轉換為對象解析器函數創建包含語法的字符串使用解析器,解析文本并生成對象使用函數時,必須為傳入的數據參數添加括號,否則會報語法錯誤。 區別 JSON(JavaScript Object Notation)僅僅是一種數據格式(或者叫數據形式)。數據格式其實就是一種規范,按照這種規范來存諸和交換數據。就好像 XML 格式一樣。 ...
摘要:布爾值和也是有效的形式。同一個對象中絕對不應該出現兩個同名屬性。序列化選項還可以接受兩個參數,用于指定以不同方式序列化對象。當傳入了有效縮進參數值,結果字符串就會包含換行符。對第步返回的每個值進行相應的序列化。 前言 JSON(JavaScript Object Notation,JavaScript對象表示法)是JavaScript的一個嚴格的子集,利用了JavaScript中的一些...
閱讀 1217·2023-04-25 20:31
閱讀 3723·2021-10-14 09:42
閱讀 1494·2021-09-22 16:06
閱讀 2660·2021-09-10 10:50
閱讀 3529·2021-09-07 10:19
閱讀 1778·2019-08-30 15:53
閱讀 1176·2019-08-29 15:13
閱讀 2823·2019-08-29 13:20