共计 4230 个字符,预计需要花费 11 分钟才能阅读完成。
JSON
XML 已经一度成为互联网上传输数据的事实标准。第一代 Web 服务很大水平上是以 XML 为根底的,以服务器间通信为次要特色。可是,XML 也并非没有批评者。有的人认为 XML 过于冗余和啰唆。为解决这些问题,也呈现了几种计划。不过 Web 曾经朝着它的新方向进发了。
2006 年,Douglas Crockford 在国内互联网工程工作组(IETF,The Internet Engineering Task Force)制订了 JavaScript 对象简谱(JSON,JavaScript Object Notation)规范,即 RFC 4627。但实际上,JSON 早在 2001 年就开始应用了。JSON 是 JavaScript 的严格子集,利用 JavaScript 中的几种模式来示意结构化数据。Crockford 将 JSON 作为代替 XML 的一个计划提出,因为 JSON 能够间接传给 eval()而不须要创立 DOM。
了解 JSON 最要害的一点是要把它当成一种数据格式,而不是编程语言。JSON 不属于 JavaScript,它们只是领有雷同的语法而已。JSON 也不是只能在 JavaScript 中应用,它是一种通用数据格式。很多语言都有解析和序列化 JSON 的内置能力。
实践上用户端传输数据到服务器和服务器传输数据到用户端采纳 json 格局,json 格局就是字符串。服务器和用户端拿到 json 能够把 json 转换为 JavaScript 格局来执行,也能够把本人的 JavaScript 转换成 json 格局来传输
语法
JSON 语法反对三种类型的值,别离是 简略值 , 对象 , 数组
- 简略值:字符串、数值、布尔值和 null 能够在 JSON 中呈现,就像在 JavaScript 中一样。非凡值 undefined 不能够。
- 对象:第一种简单数据类型,对象示意有序键 / 值对。每个值能够是简略值,也能够是简单类型。
- 数组:第二种简单数据类型,数组示意能够通过数值索引拜访的值的有序列表。数组的值能够是任意类型,包含简略值、对象,甚至其余数组。
留神:
JSON 没有变量、函数或对象实例的概念。JSON 的所有记号都只为示意结构化数据,尽管它借用了 JavaScript 的语法,然而千万不要把它跟 JavaScript 语言混同。
解析和序列化
-
Javascript 转 JSON 字符串
let person = { name: "小明", address: [ "China", "BeiJing" ], age: 18, birthday: "2008,9,11" }; let json =JSON.stringify(person);// 申明 json 用来保留 JavaScript 转换成的 json 字符串
console.log(json);
{"name":"小明","address":["China","BeiJing"],"age":18,"birthday":"2008,9,11"}
console.log(typeof json);
=>string在给小明加个女朋友
let person = { name: "小明", // 姓名:小明 address: [ // 地址 "China", // 中国 "BeiJing" // 北京 ], age: 18, // 年龄 birthday: "2008,9,11",// 生日 girlfriend: undefined// 女朋友:未定义 };
留神:小明还没有女朋友,这里给的是
undefined
,而后再转换成 JSON 格局{"name":"小明","address":["China","BeiJing"],"age":18,"birthday":"2008,9,11"}
会发现:啥女朋友,连个女朋友的栏位都没有了,切记:在 JavaScript 中,属性值是
undefined
,转换成 JSON 格局会生效,如果必须给undefined
这个值,那么必须用 字符串的 undefined - JOSN 字符串转 JavaScript
let person = {
name: "小明", // 姓名:小明
address: [ // 地址
"China", // 中国
"BeiJing" // 北京
],
age: 18, // 年龄
birthday: "2008,9,11",// 生日
girlfriend: "undefined"// 女朋友:未定义
};
let json = JSON.stringify(person);
console.log(json);
let js = JSON.parse(json);
console.log(js);
这里的 json
{"name":"小明","address":["China","BeiJing"],"age":18,"birthday":"2008,9,11","girlfriend":"undefined"}
json 转换为 JavaScript
{
name: '小明',
address: ['China', 'BeiJing'],
age: 18,
birthday: '2008,9,11',
girlfriend: 'undefined'
}
变成一个对象,字符串的 undefined方才说过,想要 undefined
就先用字符串,后续通过一些操作转换为,正真的 undefined 值
转换 undefined
如果传输的数据用的是 json 格局,json 最终都是转换成 JavaScript 来运行的,如果想在数据中有 undefined 这个值,那么必须用字符串的 undefined。
{"name":"小明","address":["China","BeiJing"],"age":18,"birthday":"2008,9,11","girlfriend":"undefined"}
这条 json 数据转换成 JavaScript 格局的代码来运行,就会发现属性值外面的 undefined 是一个字符串,与冀望的 undefined 类型的 undefined 值不合乎。
{
name: '小明',
address: ['China', 'BeiJing'],
age: 18,
birthday: '2008,9,11',
girlfriend: 'undefined'
}
略微复杂化一点 json 数据转换成的 JavaScript 代码,例如是这样的
let obj = {
name: "小明", // 姓名:小明
address: [ // 地址
"China", // 中国
"BeiJing" // 北京
],
age: 18, // 年龄
birthday: "2008,9,11",// 生日
girlfriend: "undefined",// 女朋友:未定义
obj: {
a: 'undefined',
b: {
a: "undefined",
c: {
a: 'undefined',
d: {
a: 'undefined',
b: 12471234,
c: function () {console.log(777);
}
}
}
}
}
};
这么简单的数据,如果手动一条一条批改外部的字符串的 undefined 显得很不迷信,能够手动写一个函数来转换
function conversion(obj) {let target = {};// 创立一个空对象
let keys = Object.keys(obj);// 对象属性名的数组
for (const key of keys) {// 遍历这个数组
// 给空对象增加属性名和属性值
target[key] = obj[key];
// 判断这里如果是字符串的 undefined,那么就转换为 undefined 类型的 undefined
if (obj[key] === 'undefined') target[key] = undefined;//-- 敞开正文就扭转原对象 obj[key]=undefined
// 如果判断属性值是一个对象,那么传入这个属性值对象
if (typeof obj[key] === "object") conversion(obj[key]);
}
// 返回这个空对象
return target;
}
这里是不扭转原对象,如果原对象还有其余用,怕造成不必要的麻烦,如果想扭转原对象只有关上一条正文就能够。
这里能够测试,把方才的小明传入
let myobj = conversion(obj);
json 数据中想传 undefined,能够改成字符串前面交给 JavaScript 解决,JavaScript 想把数据转换成 json 格局要小心外部的 undefined,也能够通过下面的例子,做一个相同的函数,先把 JavaScript 中的 undefined 转换成字符串的 undefined,也就是把下面的字符串的 undefined 改成 undefined 值,转换函数只是把判断扭转一下,如果是 undefined 值就转换成字符串
let obj = {
name: "小明", // 姓名:小明
address: [ // 地址
"China", // 中国
"BeiJing" // 北京
],
age: 18, // 年龄
birthday: "2008,9,11",// 生日
girlfriend: undefined,// 女朋友:未定义
obj: {
a: undefined,
b: {
a: undefined,
c: {
a: undefined,
d: {
a: undefined,
b: 12471234,
c: function () {console.log(777);
}
}
}
}
}
};
function conversion(obj) {let target = {};// 创立一个空对象
let keys = Object.keys(obj);// 对象属性名的数组
for (const key of keys) {// 遍历这个数组
// 给空对象增加属性名和属性值
target[key] = obj[key];
// 判断这里如果是 undefined,那么就转换为字符串类型的 undefined
if (obj[key] === undefined) target[key] = 'undefined';
// 如果判断属性值是一个对象,那么传入这个属性值对象
if (typeof obj[key] === "object") conversion(obj[key]);
}
// 返回这个空对象
return target;
}
let myobj = conversion(obj);
console.log(myobj)
如果感觉两个函数麻烦,能够把这函数的判断批改,如果是字符串的 undefined 那么就转换成 undefined 值,反之亦然,也就是一个 if-else 就能够解决的事件,然而用一个函数,如果重复转换,迟早把本人搞懵逼,不如用两个函数,用函数名字好区别本人是要干什么