Libx

Json的一些总结

字数统计: 1,638阅读时长: 6 min
2017/05/03 Share

Json,son,on,n

前几天五一没什么事就终于开始学习ajax了,然而现在还只是停留在文档的阶段,没有实际的应用。然后就是在看JSON的文档和一些博客,感觉自己应该是学到了一些东西,所以现在来总结一下。


这是MDN上对json的描述

JSON 是一种语法用来序列化对象、数组、数值、字符串、布尔值和NULL。
它基于 JavaScript 语法,但与之不同:一些JavaScript不是JSON,一些JSON不是JavaScript

所以说,首先,json是一种数据的格式,基于文本,相比于XML更加轻量。易于阅读、编写和机器解析,而因为jSON有着这些特点,所以json被广泛的应用于数据交换。

以ajax的post请求来举个栗子:

  1. 前端构造一个jS对象,用于包装要传递的数据,然后将JS对象转换为json字符串,将请求发送到后端;
  2. 后端(以PHP为例)接受到这个json字符串,将其解析为php对象,然后处理请求。
    可知:JSON在整个过程中会有3种形式:前端的JS对象,传输中的JSON字符串。

json和js对象的关系:

我觉得这个跟java和javascript有着异曲同工之妙。。。JSON的全名是:Javascript Object Notation,他的语法是基于JS的。但只是一种格式。这里有一篇文章:JSON: The JavaScript subset that isn’t.

接下来又是mdn的东西:

JavaScript 与 JSON 的区别

JavaScript类型
JSON 区别
对象和数组 属性名称必须是双引号字符串;后缀逗号被禁止。 最后一个属性后面不能有逗号。 数值 前导0是禁止的(在JSON.stringify 0将被忽略,但在JSON.parse它将抛出SyntaxError);小数点后必须至少有一位数字。 字符串 只有有限的一些字符可能会被转义;禁止某些控制字符; Unicode 行分隔符 ([U+2028](http://unicode-table.com/cn/2028/)) 和段分隔符 ([U+2029](http://unicode-table.com/cn/2029/))被允许 ; 字符串必须是双引号。 请参见以下示例,其中 [`JSON.parse()`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse "JSON.parse() 方法解析一个JSON字符串,构造由字符串描述的JavaScript值或对象。可以提供可选的reviver函数以在返回之前对所得到的对象执行变换。") 能够正常解析,但把它当作JavaScript解析时会抛出 [`SyntaxError`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/SyntaxError "SyntaxError 对象代表尝试解析语法上不合法的代码的错误。") 错误: let code = '"\u2028\u2029"'; JSON.parse(code); // 工作正常 eval(code); // 失败` 来几个例子(这个是copy的懒得打了。。):
var obj1 = {}; // 这只是 JS 对象
// 可把这个称做:JSON 格式的 JavaScript 对象
var obj2 = {"width":100,"height":200,"name":"rose"};
// 可把这个称做:JSON 格式的字符串
var str1 = '{"width":100,"height":200,"name":"rose"}';
// 这个可叫 JSON 格式的数组,是 JSON 的稍复杂一点的形式
var arr = [
{"width":100,"height":200,"name":"rose"},
{"width":100,"height":200,"name":"rose"},
{"width":100,"height":200,"name":"rose"},
];
// 这个可叫稍复杂一点的 JSON 格式的字符串
var str2='['+
'{"width":100,"height":200,"name":"rose"},'+
'{"width":100,"height":200,"name":"rose"},'+
'{"width":100,"height":200,"name":"rose"},'+
']';
#### JS中关于json的两个函数:JSON.parse() JSON.stringify() json.parse()和json.stringify()可以说是对应的两种函数,但是又不完全相对。。前者对格式的要求极高错一点都不行,错一点就会让你一直debug。而后者就很聪明了,只要你写的是一个JS对象他就能把你序列化出来,惊不惊喜,意不意外? * * * 下面来详细的说一下两个函数: json.parse()...还是先说JSON.stringify()吧比较合适://`**JSON.stringify()**` 方法将一个JavaScript值转换为一个JSON字符串,如果指定了一个replacer函数,则可以替换值,或者如果指定了一个replacer数组,可选地仅包括指定的属性。语法为:
`JSON.stringify(_value_[, _replacer_ [, _space_]])`
虽然一般使用的时间只会传入一个JSON格式的value但是还有另外两个参数; ##### 参数:
`value`
将要序列化成 一个JSON 字符串的值。
`replacer` 可选
如果该参数是一个函数,则在序列化过程中,被序列化的值的每个属性都会经过该函数的转换和处理;如果该参数是一个数组,则只有包含在这个数组中的属性名才会被序列化到最终的 JSON 字符串中;如果该参数为null或者未提供,则对象所有的属性都会被序列化;关于该参数更详细的解释和示例,请参考[使用原生的 JSON 对象](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Using_native_JSON#The_replacer_parameter)一文。
`space` 可选
指定缩进用的空白字符串,用于美化输出(pretty-print);如果参数是个数字,它代表有多少的空格;上限为10。改值若小于1,则意味着没有空格;如果该参数为字符串(字符串的前十个字母),该字符串将被作为空格;如果该参数没有提供(或者为null)将没有空格
对于序列化还有以下这些注意点: * 非数组对象的属性不能保证以特定的顺序出现在序列化后的字符串中。 * 布尔值、数字、字符串的包装对象在序列化过程中会自动转换成对应的原始值。 * `undefined、`任意的函数以及 symbol 值,在序列化过程中会被忽略(出现在非数组对象的属性值中时)或者被转换成 `null`(出现在数组中时)。 * 所有以 symbol 为属性键的属性都会被完全忽略掉,即便 `replacer` 参数中强制指定包含了它们。 * 不可枚举的属性会被忽略 * * * 接下来是jSON.parse() 语法:
JSON.parse(_text_[, _reviver_])
参数

text

要被解析成JavaScript值的字符串。

reviver 可选

如果是一个函数,则规定了原始值在被返回之前如何被解析改造。

返回值

Object对应给定的JSON文本。

异常

若被解析的 JSON 字符串是非法的,则会抛出 一个语法错误异常

JSON.parse() 不允许用逗号作为结尾:

`// 都将抛出 SyntaxError
JSON.parse(“[1, 2, 3, 4, ]”);
JSON.parse(‘{“foo” : 1, }’);


嗯,感觉大概就想这么多吧。以后再加~这里要立一个flag,下周周末前要把AJAX搞会!!

Done~

写线代作业啊啊啊啊啊。。

CATALOG
  1. 1. Json,son,on,n
    1. 1.1. 这是MDN上对json的描述
    2. 1.2. json和js对象的关系:
      1. 1.2.1. 参数
      2. 1.2.2. 返回值
      3. 1.2.3. 异常
      4. 1.2.4. JSON.parse() 不允许用逗号作为结尾: