哎哟,这就是JSON

写这篇文章的启事

你相识JSON嘛?JSON是JavaScript中对象嘛?JSON能够存储function对象嘛?JSON的实质是什么呢?JSON能写解释嘛?
如果你都能答上来,那祝贺你,你对JSON相识的很测底,如果你有写不太邃晓,哪有必要和我一起来讨论JSON

我之前对JSON的观点也是一孔之见,常常和JavaScript的Object对象殽杂,所以就致使了许多各种的毛病,迥殊是在研讨NodeJS中,有一个叫package.json的文件特地用来存储json花样的数据。如果你在这个文件内里写解释,或许存储函数,终究剖析这个文件时就会报错。

然后本身查阅了些相干的材料,得出些结论。如今拿出来和人人分享一下,同时,如果文章中有马虎的处所,人人能够帮我指导纠正下。

JSON是什么

起首我们来看看官方是怎样形貌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成为抱负的数据交换言语。参考泉源地点:http://www.json.org/json-zh.html

官方的说法,也不是迥殊的清楚明了,只说清楚明了这是一种轻量级的数据交换花样,且基于JavaScript一个子集。这基础申明不了什么?不过我遐想到了别的一种数据交换花样,那就是xml,这个花样迥殊在webService中被大批运用。xml是什么呢,其实质是一种DOM构造。对照一下,那json实质就是字符串了,不过这个字符串不是差别的字符串,它有一些列的语法和构造。下面我们就引见下其语法。

JSON的语法引见

罕见JSON数据构造有两种情势,其离别是:

  • “称号/值”对的鸠合,相似JavaScript中的对象。
  • 值的有序列表(An ordered list of values)。在大部分言语中,它被理解为数组(array)。

起首来看第一种状况:对象是一个无序的“‘称号/值’对”鸠合。一个对象以“{”(左括号)最先,“}”(右括号)完毕。每一个“称号”后跟一个“:”(冒号);“‘称号/值’ 对”之间运用“,”(逗号)分开。

《哎哟,这就是JSON》

这和JavaScript中的对象字面量比较相似,然则实质上照样有些区分的。比方对象中的称号(或许称为key)是必需用双引号括起来的。单引号都不可,更别说疏忽它了,虽然JavaScript中的对象中的称号值常常疏忽双引号。比方

{
    name : 'test',
    age  : 123,
    success : function(){
        //todo
    }
}

则在JSON中是行不通的。除了”称号(key)”值有限定外,对象中的”值(value)”也做了限定,比方在JavaScript中的对象字面量中的值能够随意赋值,不管是字符串、数组、函数、整形都是能够的。JSON中的取值能够是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或许数组(array),
《哎哟,这就是JSON》

除此之外,这些值之外都会被剖析出题目,像适才头中提到的,如果给JSON的值赋值一个function是一个毛病的行动。

接下来,看看值的有序列表(或许称为数组),数组是值的有序列表,一个数组以“[”(左中括号)最先,“]”(右中括号)完毕。值之间运用“,”(逗号)分开,而且值的限定状况在上面中已提到。

《哎哟,这就是JSON》

差不多把语法引见完了,总结一下,JSON其实质是一串有意义的字符串数据交互花样。呵呵,不知道我定义的正不正确。

JavaScript言语中JSON的剖析和序列化

在JavaScript中常常是要对JSON举行处置惩罚的,比方提交一个数据前常常需要对其举行序列化处置惩罚,从厥后拉过来的JSON数据,我们常常要对它举行剖析然后获得一个JavaScript对象。能够因为人人常常运用一些JavaScript类库,这些库对JSON的操纵做了封装,所以形成一种征象,那就是我们只会用,对齐实质,我们相识甚少。如今我们就抛开类库,相识其底层的实质。

初期的JSON剖析器经由历程JavaScript中eval()函数来剖析的。直到ECMA5对齐举行了范例,而且定义了一个全局的JSON对象用来对JSON举行剖析和序列化。支撑JSON这个全局对象的浏览器包含IE8+、FF3.5+、Safari4+、Chrome和Opera10.5+。关于不支撑这个对象的浏览器比方IE6、IE7怎样做处置惩罚呢?

不必忧郁,JSON的发明者早就帮我们完成了兼容的代码,其地点为:https://github.com/douglascrockford/JSON-js。关于不支撑原生的JSON对象的。我们能够引入这段代码处理兼容性的题目。

JSON有两个重要要领,用来处理JSON的序列化和剖析,其离别是stringfyparse.让我们离别来看看它们的用法。

ECMA5定义的标准接口以下所示:

/**
@param {*} value
@param {Function} [replacer]
@param {Number|String} [space]
@static
*/
JSON.stringify = function(value,replacer,space) {};

个中对一个参数是必需滴,而且是我们要举行序列化的对象。示例代码以下所示:

var obj = {
    name : 'hello',
    age  : 18
}

var jsonText = JSON.stringify(obj)    //输出:{"name":"hello","age":18}

第二个参数是可选项,能够是函数或许是数组。如果是数组,那末数组中指定是过滤项,以上面例子为例,举行以下挪用:

var jsonText = JSON.stringify(obj,["name"])     //输出: {"name":"hello"}

如果是函数的话,回调函数内里的参数对应Javascript中对象内里的keyvalue值。示例以下:

var jsonText = JSON.stringify(obj,function(key,value){
    switch(key) {
        case "name": return value+" json";
        case "age" : return 20;
        default : return value;
    }
});
//输出 {"name":"hello json","age":20}

第三个参数也是可选的。用来举行字符串缩进,示例以下:

var jsonText = JSON.stringify(obj,null,4); //按4个空格缩进

//输出的效果不再是单行,而是下面的情势:
{
    "name" : "hello",
    "age" :  18
}

除了能够设置数字外,还能够用字符设置缩进,有兴致人人能够尝试一下。

ECMA5对parse接口的定义以下:

/**
@param {string} jsonString
@param {Function} [reviver]
@static
*/
JSON.parse = function(jsonString,reviver) {};

该要领接收两个参数,个中第二个参数是可选的。

第一个参数的作用是待转换的JSON字符串。比方我们能够将上面的jsonText经由历程parse还原成本来的Javascript对象。

var obj = JSON.parse(jsonText); //obj为JavaScript对象。

第二个参数是一个函数,用来越发纤细的掌握转换历程。它接收两个参数,离别对应着JSON数据的键值对。挪用示例以下:

   var obj = JSON.parse(jsonText,function(key,value){
        //todo
    }); 

协助链接

JSON中文官网

    原文作者:两仪
    原文地址: https://segmentfault.com/a/1190000002453853
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞