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 就能够解决的事件,然而用一个函数,如果重复转换,迟早把本人搞懵逼,不如用两个函数,用函数名字好区别本人是要干什么