什么是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 排名:100005.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 对象也得到了很多浏览器的支持,几乎支持所有浏览器,大家放心的用吧
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号