JSON常用方法

JSON对象和JSON字符串的转换

JSON在数据传输过程中,JSON是以字符串的形式传递的,而JS操作的是JSON对象,所以,JSON对象和JSON字符串之间的相互转换是关键。例如:
JSON字符串:

var jsonStr ='{"name":"Liza", "password":"123"}' ;

JSON对象:

var jsonObj = {"name":"Liza", "password":"123"};

1.JSON字符串转化JavaScript对象

var jsonObject= jQuery.parseJSON(jsonstr);
console.log(jsonObject) //{name:"Liza",password:"123"}

2.JavaScript对象转化JSON字符串

var jsonstr =JSON.stringify(jsonObject );
console.log(jsonstr) //{"name":"Liza", "password":"123"}

这个例子使用 JSON.stringify()把一个 JavaScript对象序列化为一个 JSON字符串,然后将它保 存在变量 jsonText 中。默认情况下,JSON.stringify()输出的 JSON字符串不包含任何空格字符或缩进。

序列化选项

实际上,JSON.stringify()除了要序列化的 JavaScript对象外,还可以接收另外两个参数,这两 个参数用于指定以不同的方式序列化 JavaScript 对象。第一个参数是个过滤器,可以是一个数组,也可 以是一个函数;第二个参数是一个选项,表示是否在 JSON字符串中保留缩进。单独或组合使用这两个 参数,可以更全面深入地控制 JSON的序列化。

1. 过滤结果 :如果过滤器参数是数组,那么 JSON.stringify()的结果中将只包含数组中列出的属性。来看下 面的例子。

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

JSON.stringify()的第二个参数是一个数组,其中包含两个字符串:“title"和"edition”。这 两个属性与将要序列化的对象中的属性是对应的,因此在返回的结果字符串中,就只会包含这两个属性:

{"title":"Professional JavaScript","edition":3} 

如果第二个参数是函数,行为会稍有不同。传入的函数接收两个参数,属性(键)名和属性值。根 据属性(键)名可以知道应该如何处理要序列化的对象中的属性。属性名只能是字符串,而在值并非键 值对儿结构的值时,键名可以是空字符串。
为了改变序列化对象的结果,函数返回的值就是相应键的值。不过要注意,如果函数返回了undefined,那么相应的属性会被忽略。还是看一个例子吧。

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;    
      }
 }); 

这里,函数过滤器根据传入的键来决定结果。如果键为"authors",就将数组连接为一个字符串; 如果键为"year",则将其值设置为 5000;如果键为"edition",通过返回 undefined 删除该属性。 后,一定要提供 default 项,此时返回传入的值,以便其他值都能正常出现在结果中。实际上,第 一次调用这个函数过滤器,传入的键是一个空字符串,而值就是 book 对象。序列化后的 JSON字符串 如下所示:

{"title":"Professional JavaScript","authors":"Nicholas C. Zakas","year":5000} 

要序列化的对象中的每一个对象都要经过过滤器,因此数组中的每个带有这些属性的对象经过过滤 之后,每个对象都只会包含"title"、"authors"和"year"属性。

2. 字符串缩进 :JSON.stringify()方法的第三个参数用于控制结果中的缩进和空白符。如果这个参数是一个数值,那它表示的是每个级别缩进的空格数。例如,要在每个级别缩进 4个空格,可以这样写代码:

var jsonText = JSON.stringify(book, null, 4); 

保存在 jsonText 中的字符串如下所示:

{      
"title": "Professional JavaScript",     
"authors": [        
   "Nicholas C. Zakas"   
],     
   "edition": 3,     
   "year": 2011 
 } 

JSON.stringify()也在结果字符串中插入了换行符以提高可读性。只要传入有效的控制缩进的参数值,结果字符串就会包含换行符。(只缩进而不换行意义不大。)大缩进空格数为 10,所有大于10的值都会自动转换为 10。 如果缩进参数是一个字符串而非数值,则这个字符串将在 JSON字符串中被用作缩进字符(不再使用空格)。在使用字符串的情况下,可以将缩进字符设置为制表符,或者两个短划线之类的任意字符。

var jsonText = JSON.stringify(book, null, " - -"); 

这样,jsonText 中的字符串将变成如下所示:

{ 
--"title": "Professional JavaScript", 
--"authors": [ 
----"Nicholas C. Zakas" 
--], 
--"edition": 3, --"year": 2011 } 
 

3. toJSON()方法 :有时候,JSON.stringify()还是不能满足对某些对象进行自定义序列化的需求。在这些情况下, 可以给对象定义 toJSON()方法,返回其自身的JSON数据格式。原生 Date 对象有一个 toJSON()方法, 能够将JavaScript的Date对象自动转换成ISO 8601日期字符串(与在Date对象上调用toISOString() 的结果完全一样)。
可以为任何对象添加 toJSON()方法,比如:

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

以上代码在 book 对象上定义了一个 toJSON()方法,该方法返回图书的书名。与 Date 对象类似, 这个对象也将被序列化为一个简单的字符串而非对象。可以让 toJSON()方法返回任何值,它都能正常工作。比如,可以让这个方法返回 undefined,此时如果包含它的对象嵌入在另一个对象中,会导致 它的值变成 null,而如果它是顶级对象,结果就是 undefined。

解析选项

JSON.parse()方法也可以接收另一个参数,该参数是一个函数,将在每个键值对儿上调用。为了 区别 JSON.stringify()接收的替换(过滤)函数(replacer),这个函数被称为还原函数(reviver), 但实际上这两个函数的签名是相同的——它们都接收两个参数,一个键和一个值,而且都需要返回一 个值。 如果还原函数返回 undefined,则表示要从结果中删除相应的键;如果返回其他值,则将该值插入到结果中。在将日期字符串转换为 Date 对象时,经常要用到还原函数。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值