讀javascript高級程序設計13-JSON


JSON是一個輕量級的數據格式,可以簡化表示數據結構的工作量。在實際工作中,我們經常用它來傳遞數據,不過對於其使用的一些細節還是需要注意的。在ECMAScript5中定義了原生的JSON對象,可以用來將對象序列化為JSON字符串,或者將JSON數據解析為javascript對象。

一、JSON語法

JSON可以用來表示三種類型的值:簡單值、對象和數組。對象和數組一般是JSON結構的最外層形式。

1.JSON簡單值

可以在JSON中表示字符串、數值、布爾值、null。

例如:

5//數值類型

"hello json"//字符串類型

注意:

①JSON不支持js中的特殊值undefined;

②JSON字符串必須使用雙引號,不能使用單引號。

③在實際應用中,JSON一般用來表示較復雜的數據結構,而簡單值一般用作復雜數據結構中的一部分。

2.對象

JSON對象與JavaScript對象字面量對象的語法是類似的。

//JavaScript對象字面量表示
var jsWeatherinfo={
  city:"北京",
  cityid:"101010100",
  weather:"多雲轉晴"
//JSON對象
{
  "city":"北京",
  "cityid":"101010100",
  "weather":"多雲轉晴"
}

但是有幾點不同:

①JSON中沒有變量的概念,所以沒有聲明變量;

②JSON末尾沒有分號;

③JSON對象中的屬性名一定要使用雙引號,而JavaScript對象中的屬性引號是可有可無的。

3.數組

JSON數組采用的是javascript的數組字面量形式.

//JavaScript數組

var result=[1,true,"today"];

//JSON數組

[1,true,"today"]

區別:JSON數組沒有末尾的分號,也沒有聲明變量.

二、JSON序列化

1.JSON對象

JavaScript的eval()函數可以用來解析JSON並返回JavaScript對象,不過eval()對JSON結構求值是存在風險的.因此,在ECMAScript5中新增了全局的JSON對象.JSON對象有兩個方法:stringify()和parse().

stringify()用於把JavaScript對象序列化為JSON字符串;

parse()用於把JSON字符串解析為原生的JavaScript值.

var weather={
'city': '北京',
'cityid': '101010100',
'temp1': '31℃',
'temp2': '20℃',
'weather': '多雲轉晴',
'img1': 'd1.gif',
'img2': 'n0.gif',
'ptime': '11:00'
};
var text=JSON.stringify(weather);
var json=JSON.parse(text);
json.weather;//"多雲轉晴"

 

2.JSON.stringify()

JSON.stringify()方法有三個參數:

第一個參數是要序列化的JavaScript對象;

第二個參數是過濾器,可以是一個數組或者函數;

第三個參數是一個布爾值,表示是否在JSON字符串中保留縮進.

①過濾器

如果過濾器參數是數組,那么stringify()結果中只包含該數組中列出的屬性.

var weather={
'city': '北京',
'cityid': '101010100',
'temp1': '31℃',
'temp2': '20℃',
'weather': '多雲轉晴',
'img1': 'd1.gif',
'img2': 'n0.gif',
'ptime': '11:00'
};
var text=JSON.stringify(weather,["city","weather","temp1","temp2"]);
//結果:"{"city":"北京","weather":"多雲轉晴","temp1":"31℃","temp2":"20℃"}"

如果過濾器是函數,傳入的函數有兩個參數:屬性名和屬性值.根據屬性名來判斷如何處理序列化對象中相應的屬性.如果函數返回了undefined,那么相應的屬性就會被忽略.

var text1 = JSON.stringify(weather, function (key, value) {
switch (key) {
case 'temp1':
return '最高溫度' + value;
case 'temp2':
return '最低溫度' + value;
case 'img1':
case 'img2':
case 'ptime':
return undefined;//屬性被忽略
default:
return value;
}
});
//結果:"{"city":"北京","cityid":"101010100","temp1":"最高溫度31℃","temp2":"最低溫度20℃","weather":"多雲轉晴"}"

③字符串縮進

JSON.stringify()第三個參數用來控制結果中的縮進情況.

如果縮進參數傳入的是數值,表示每個json字段縮進的空格數,但是最大縮進空格數不超過10.

var text2=JSON.stringify(weather,null,5)

如果縮進參數傳入的是字符串,則表示JSON字符串中每個級別都使用該字符串作為縮進字符.不過該字符串也不能超過10個字符長.

var text3=JSON.stringify(weather,null,"--")

④toJSON()方法

如果JSON.stringify()不能滿足某些對象的序列化需求,可以給對象自定義toJSON方法,返回其自身的JSON數據格式。

var weather={
'city': '北京',
'cityid': '101010100',
'temp1': '31℃',
'temp2': '20℃',
'weather': '多雲轉晴',
  toJSON:function(){
  return this.city+this.weather+",最高溫度"+this.temp1+",最低溫度"+this.temp2;
  }
};
JSON.stringify(weather);//""北京多雲轉晴,最高溫度31℃,最低溫度20℃""

綜合以上幾種情況,JSON.stringify()序列化對象的順序如下:

①如果對象存在toJSON方法且能返回有效值,則調用該方法;否則,仍然按照默認順序執行序列化。

②如果stringify()存在第二個參數,應用這個過濾器;

③對第②步返回的每個值進行序列化;

④如果存在第三個參數,執行相應的格式化。

三、JSON解析

JSON.parse()用來將JSON字符串解析成JavaScript對象。

該方法第一個參數要解析的JSON字符串;

第二個參數是一個函數還原函數。還原函數有兩個參數key和value。如果還原函數返回undefined,則表示將該屬性從結果中刪除;如果返回其它值,則將該值插入到結果當中。在將日期字符串轉換為Date對象時,經常用到還原函數.

var json = {
  'city': '北京',
  'cityid': '101010100',
  'temp1': '19℃',
  'temp2': '32℃',
  'weather': '晴',
  'ptime': new Date()
};
var text = JSON.stringify(json);
JSON.parse(text, function (key, value) {
  switch (key) {
  case 'ptime':
    return new Date(value);//返回日期對象
  case 'cityid':
    return undefined;//刪除該屬性
  default:
    return value;
  }
});

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM