1. 程式人生 > >JSON文件

JSON文件

字符串 格式 java 序列 turn fault 火狐 其他 return

JSON是JavaScript的一個嚴格的子集,利用JavaScript中的一些模式來表示結構化數據。
JSON是一種結構化的數據表示方式。所以,JSON並不是JavaScript獨有的數據格式,
其他很多語言都可以對JSON進行解析和序列化。
JSON的語法可以表示三種類型的值:
1.簡單值:可以在JSON中表示字符串、數值、布爾值和null。但JSON不支持JavaScript中的特殊值undefined。
2.對象:顧名思義。
數組:顧名思義。
一、簡單值:
18,"wxx"這兩個量就是JSON的表示方法100、一個是JSON數值,一個是JSON字符串。布爾值和null也是有效的形式。但實際運用中要結合對象或數組。
二、對象:
JavaScript對象字面量表示法:
var box = {
name : ‘wxx‘,
age : 18
};
而JSON中的對象表示法需要加上雙引號,並且不存在賦值運算和分號:
{
"name" : "wxx", //使用雙引號,否則轉換會出錯
"age" : 18
}
//Json說白了就是一個字符串,所以任何表示,都應該加上引號表示字符串
三、數組
JavaScript數組字面量表示法:
var box = [18, ‘wxx‘, true];

而JSON中的數組表示法同樣沒有變量賦值和分號:
[18, ‘wxx‘, true];
//Json對象和數組比普通對象和數組,少了分號,少了變量賦值,而且本身應該是字符串表示
一般比較常用的一種復雜形式是數組結合對象的形式:
[
{
"title" : "a",
"number" : 1
},
{
"title" : "b",
"number" : 2
},
{
"title" : "c",
"number" : 3
}
]
一般情況下,我們可以把JSON結構數據保存到一個文本文件裏,然後通過XMLHttpRequest對象去加載它,得到這串結構數據字符串。所以,我們可以模擬這種過程。

模擬加載JSON文本文件的數據,並且賦值給變量。
var box = ‘[{"name" : "a","age" : 1},{"name" : "b","age" : 2}]‘;
上面這短代碼模擬了var box = load(‘demo.json‘);賦值過程。因為通過load加載的文本文件,不管內容是什麽,都必須是字符串。所以兩邊要加上雙引號。


其實JSON就是比普通數組多了兩邊的雙引號,普通數組如下:
var box = [{name : ‘a‘, age : 1},{name : ‘b‘, age : 2}];

四.解析和序列化
如果是載入的JSON文件,我們需要對其進行使用,那麽就必須對JSON字符串解析成原生的JavaScript值。當然,如果是原生的JavaScript對象或數組,也可以轉換成JSON字符串。
對於將JSON字符串解析為JavaScript原生值,早期采用的是eval()函數。但這種方法既不安全,
可能會執行一些惡意代碼。
var box = ‘[{"name" : "a","age" : 1},{"name" : "b","age" : 2}]‘;
alert(box); //JSON字符串
var json = eval(box); //使用eval()函數解析
alert(json); //得到JavaScript原生值

ECMAScript5對解析JSON的行為進行規範,定義了全局對象JSON。支持這個對象的瀏覽器有IE8+、Firefox3.5+、Safari4+、Chrome和Opera10.5+。不支持的瀏覽器也可以通過一個開源庫json.js來模擬執行。JSON對象提供了兩個方法,一個是將原生JavaScript值轉換為JSON字符串:stringify();另一個是將JSON字符串轉換為JavaScript原生值:parse()。

var box = ‘[{"name" : "a","age" : 1},{"name" : "b","age" : 2}]‘; //特別註意,鍵要用雙引號
alert(box);
var json = JSON.parse(box); //不是雙引號,會報錯
alert(json);

var box = [{name : ‘a‘, age : 1},{name : ‘b‘, age : 2}]; //JavaScript原生值
var json = JSON.stringify(box); //轉換成JSON字符串
alert(json); //自動雙引號

在序列化JSON的過程中,stringify()方法還提供了第二個參數。第一個參數可以是一個數組,
也可以是一個函數,用於過濾結果。第二個參數則表示是否在JSON字符串中保留縮進。
var box = [{name : ‘a‘, age : 1, height : 177},{name : ‘b‘, age : 2, height : 188}];
var json = JSON.stringify(box, [‘name‘, ‘age‘], 4);
alert(json);
如果不需要保留縮進,則不填即可;如果不需要過濾結果,但又要保留縮進,則講過濾結果的參數設置為null。如果采用函數,可以進行復雜的過濾。

技術分享
var box = [{name : ‘a‘, age : 1, height : 177},{name : ‘b‘, age : 2, height : 188}];
var json = JSON.stringify(box, function (key, value) {
switch (key) {
case ‘name‘ : 
return ‘Mr. ‘ + value;
case ‘age‘ : 
return value + ‘歲‘;
default : 
return value;
}
}, 4);
alert(json);
技術分享


//火狐3.5和3.6在最初支持JSON的之後,Stringfy方法有個小bug,執行function會出錯
保留縮進除了是普通的數字,也可以是字符。

還有一種方法可以自定義過濾一些數據,使用toJSON()方法,可以將某一組對象裏指定返回某個值。

技術分享
1 var box = [{name : ‘a‘, age : 1, height : 177, toJSON : function () {
2 return this.name;
3 }},{name : ‘b‘,age : 2, height : 188, toJSON : function () {
4 return this.name;
5 }}];
6 var json = JSON.stringify(box);
7 alert(json);
技術分享

由此可見序列化也有執行順序,首先先執行toJSON()方法;如果應用了第二個過濾參數,
則執行這個方法;然後執行序列化過程,比如將鍵值對組成合法的JSON字符串,比如加上雙引號。
如果提供了縮進,再執行縮進操作。


解析JSON字符串方法parse()也可以接受第二個參數,這樣可以在還原出JavaScript值的時候替換
成自己想要的值。

技術分享
var box = ‘[{"name" : "a","age" : 1},{"name" : "b","age" : 2}]‘;
var json = JSON.parse(box, function (key, value) {
if (key == ‘name‘) {
return ‘Mr. ‘ + value;
} else {
return value;
}
});
alert(json[0].name);
技術分享

JSON文件