Blogger Information
Blog 34
fans 0
comment 0
visits 33827
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
JSON小知识大作用
Serendipity-Ling
Original
749 people have browsed it

  什么是JSON?

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。它是基于 JavaScript Programming Language , Standard ECMA-262 3rd Edition - December 1999 的一个子集。 JSON采用完全独立于程序语言的文本格式,但是也使用了类C语言的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。(转载自json.cn)

一.json 可将js对象转化为json字符串

var obj = {
      name:'xiaoming',  //字符
      age:18,           //数字
      isMarried:false,  //布尔值
      '':'empty',       //空键名
      sex:undefined,   //undefined
      weight:null,       //null
      getName:function (){   //函数
        return this.name
       }
}

将这个对象转化为json字符串

var objJson = JSON.stringify(obj)
console.log(objJson)
//得到{"name":"xiaoming","age":18,"isMarried":false,"":"empty","weight":null}

json字符串的特点
1.1. 所有属性名必须使用双引号
1.2. 如果属性值为字符串,必须使用双引号进行包装
1.3. 不支持undefined 类型(过滤掉了undefined)
1.4. 不支持属性为函数的方法成员
1.5. 键名允许为空

二. 将js数组转为js字符串

创建一个数组

var arr = ['php', 1, true, null,undefined,'']
//将js数组转为js字符串
var brandJson = JSON.stringify(arr)
console.log(brandJson)
//得到["php",1,true,null,null,""]

json数组字符串的特点:
2.1. 字符串必须使用双引号,这与js对象是一样的
2.2. 除字符串外,支持数值,布尔,null
2.3. 自动将undefined类型的数据转为null
2.4. 支持空元素
2.5. 与js数组一样,也是使用从零开始的数值索引来访问

三. js转换参数介绍

创建js对象

var str = {
    name: 'jack',  
    sex: 'male',   
    salary: 2000,   
    isMarried: true,  
    crime: null,  
    sexual: undefined,  
    myChild: ['熊大','熊二']
}

3.1 有选择性输出

JSON.stringify(str,['name','isMarried'])
//得到{"name":"jack","isMarried":true}

3.2 函数function(property,value),可以将属性的键值依次传入进行处理

var res1 = JSON.stringify(str,function (property,value) {
        switch (property)
        {
            case 'name':
                return value + ' ma'
//            break
            case 'sex':
                return value + '? 我也不确定,你看着办'
            break;
            case 'salary':
                return value + 5000
            break
            case 'isMarried':
                return '其实是骗你的,来者不拒'
            break
            case 'crime':
                return '我和安倍家的女佣拍过片'
            break
            case 'sexual':  //属性值是undefined,但是没有跳过
                return value + '其实我是一个双性恋'
            break
            case 'myChild':
                return value + ',你应该看不到这个啦'
            break
            //最后一定要有default分支,并且必须返回value,否则你看不到正确的结果
            default:
            return value

得到

{"name":"jack ma","sex":"male? 我也不确定,你看着办","salary":7000,
"isMarried":"其实是骗你的,来者不拒","crime":"我和安倍家的女佣拍过片",
"sexual":"undefined其实我是一个双性恋","myChild":"熊大,熊二,你应该看不到这个啦"}

3.3 json数据缩进的空格数量,最大是10

JSON.stringify(str,null,4)
//或者自定义
JSON.stringify(str,null,'****')

3.4 解析json字符串为js对象

//先转为json格式的文本
var jsonText = JSON.stringify(str)
//解析jsonText为js对象
var  jsObj1 =  JSON.parse(jsonText)
//自此jsObj1 就是js对象
//更多的时候我们需要传入第二个参数,就是一个回调,对解析返回的js对象进行处理
var  jsObj2 =  JSON.parse(jsonText,function (key, value) {
    if (key == 'isMarried') {
        return '婚姻状态保密'
    } else {   //一定要有else分支,否则只会返回undefined
        return value
    }
})
console.log(jsObj2)
//得到Object { name: "jack", sex: "male", salary: 2000, isMarried: "婚姻状态保密", 
crime: null, myChild: […] }

3.4  toJSON方法

 var str = {
        name: 'jack',  //其实这不是我的真名
        sex: 'male',   //性别我不是很确定
        salary: 2000,   //工资,如果是$就好了
        isMarried: true,  //是否已婚
        crime: null,  //是否有犯罪前科
        sexual: undefined,  //我的性取向
        myChild: ['熊大','熊二'],
        //添加toJSON方法
        toJSON: function () {
//            return '有我在,你们都别想输出'
            //可以自定义属性的输出格式
//            return this.name+'的性别是:'+this.sex+'工资是'+this.salary
            //toJSON方法还可以输出值undefined的属性
            return '我的性取向是: '+this.sexual
        }
    }

    //输出json数据
    console.log(JSON.stringify(str))
    //得到"我的性取向是: undefined"
    表明toJSON是优先级在这些里面是最高的

3.5 可以使用 for-in 来循环对象的属性

var myObj = { "name":"runoob", "alexa":10000, "site":null };for (x in myObj) {
    document.getElementById("demo").innerHTML += x + "<br>";
    document.getElementById("demo").innerHTML += myObj[x] + "<br>";
}
//for-i 循环
for (var i=0; i<myObj.length; i++){
 x += myObj[i] + '<br>'
 }

前者导出属性,后者导出属性的值

4 可以使用 delete 关键字来删除 JSON 对象的属性(可使用点语法或中括号)

delete myObj.name   = = =  delet myObj["name"]
//得到 {"alexa":10000, "site":null }

5 .1 解析函数

JSON 不允许包含函数,但你可以将函数作为字符串存储,之后再将字符串转换为函数。

var obj = { "name":"php", "alexa":function () {return 10000;}, "site":“php中文网"} 
obj.alexa = obj.alexa.toString();
var text = JSON.stringify(obj);
var obj = JSON.parse(text);
obj.alexa = eval("(" + obj.alexa + ")"); 
document.getElementById("demo").innerHTML = obj.name + " Alexa 排名:" + obj.alexa();
//得到  php Alexa 排名:10000

5.2 eval() 拓展

eval(string)函数可计算某个字符串,并进行其中的js代码

eval("var a=1");     // 声明一个变量a并赋值1。
eval("2+3");         // 执行加运算,并返回运算值。
eval("mytest()");    // 执行mytest()函数。
eval("{b:2}");       // 声明一个对象。
var txt = '{ "sites" : [' +
'{ "name":"php" , "url":"www.php.cn" },' +
'{ "name":"google" , "url":"www.google.com" },' +
'{ "name":"微博" , "url":"www.weibo.com" } ]}';
var obj = eval("("+txt+")")

为什么要 eval 这里要添加 ('('+txt+')') 呢?

原因在于:eval 本身的问题。 由于 json 是以 {} 的方式来开始以及结束的,在 js 中,它会被当成一个语句块来处理,所以必须强制性的将它转换成一种表达式。

加上圆括号的目的是迫使 eval 函数在处理 JavaScript 代码的时候强制将括号内的表达式(expression)转化为对象,而不是作为语句(statement)来执行。举一个例子,例如对象字面量 {},如若不加外层的括号,那么 eval 会将大括号识别为 javascript 代码块的开始和结束标记,那么{}将会被认为是执行了一句空语句。所以下面两个执行结果是不同的:

alert(eval("{}"); // return undefined
alert(eval("({})");// return object[Object]

总结:

JSON 是一个轻量级的数据格式,可以简化表示复杂数据结构的工作量。JSON 使用 JavaScript 语法的子集
* 表示对象、数组、字符串、数值、布尔值和 null。即使 XML 也能表示同样复杂的数据结果,
* 但 JSON 没有那么烦琐,而且在 JavaScript非常方便的使用
*系统定义了一个全局的一个原生JSON 对象,可以用来将
*对象序列化为 JSON 字符串或者将 JSON 数据解析为 JS对象。JSON.stringify()和 JSON.parse()方法
* 分别用来实现上述两项功能。 这两个方法都有一些选项,通过它们可以改变过滤的方式,
* 或者改变序列化的过程。
*原生的 JSON 对象也得到了很多浏览器的支持,几乎支持所有浏览器,大家放心的用吧

Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post