你真的了解JSON吗?

一、JSON——JavaScript Object Notation

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

JavaScript 与 JSON 的区别
JavaScript类型JSON 区别
对象和数组

属性名称必须是双引号字符串

最后一个属性后不能有逗号。

数值

前导零是禁止的(在 JSON.stringify 零将被忽略,但在 JSON.parse 它将抛出 SyntaxError);

小数点后必须至少有一位数字

字符串

只有有限的一些字符可能会被转义;

禁止某些控制字符;

Unicode 行分隔符 (U+2028)和段分隔符 (U+2029)被允许 ;

字符串必须是双引号

 

请参见以下示例,其中JSON.parse()能够正常解析,但把它当作JavaScript解析时会抛出 SyntaxError 错误:

let code = '"\u2028\u2029"';
JSON.parse(code);  // 工作正常
eval(code);  // 失败

主要有两种方法:

JSON.parse() :解析一个JSON字符串,可选地转换生成的值及其属性,并返回值。

JSON.stringify():返回与指定值相对应的一个JSON字符串,可选地仅包含某些属性或以用户定义的方式替换属性值。

 

1.1 对象和数组

1)json属性名称必须是双引号字符串

js中对象和数组属性名可以加双引号或者单引号或者不加引号,都能识别。

console.log({"text" : 1 });//Object {text: 1}
console.log({'text' : 1 });//Object {text: 1}
console.log({text : 1 });//Object {text: 1}

 

json中属性名称必须是双引号字符串,即使是单引号也不行(JSON.parse转换会报错)。

json属性名不加引号报错:

JSON.parse('{text : 1 }');
//Uncaught SyntaxError: Unexpected token t in JSON at position 1
//at JSON.parse (<anonymous>) 

json属性名单引号报错。

JSON.parse("{'text' : 1 }");
//Uncaught SyntaxError: Unexpected token ' in JSON at position 1
//at JSON.parse (<anonymous>)

替换成属性双引号:

JSON.parse('{"text" : 1 }');
2)json最后一个属性后不能有逗号
1 JSON.parse('[1, 2, 3, 4, ]');
2 JSON.parse('{"text" : 1, }');
3 //Uncaught SyntaxError: Unexpected token ] in JSON at position 13
4 //at JSON.parse (<anonymous>)

 

1.2 数值

1) 前导零是禁止的(在 JSON.stringify 零将被忽略,但在 JSON.parse 它将抛出 SyntaxError)

数字不能用 0 开头,比如01。

1 JSON.parse('{"text" : 01 }');
2 //VM63:1 Uncaught SyntaxError: Unexpected token t in JSON at position 1
3 //at JSON.parse (<anonymous>)

正确写法:去除数字前0

JSON.parse('{"text" : 1 }');
2) 小数点后必须至少有一位数字
1 JSON.parse('{"text" : 1. }');
2 //Uncaught SyntaxError: Unexpected token t in JSON at position 1
3 //    at JSON.parse (<anonymous>)

正确写法:小数点后添加0

JSON.parse('{"text" : 1.0 }');

 

二、完整的json语法

JSON = null
    or true or false
    or JSONNumber
    or JSONString
    or JSONObject
    or JSONArray

 

JSONNumber

JSONNumber = - PositiveNumber//正数
          or PositiveNumber//负数

PositiveNumber = DecimalNumber
              or DecimalNumber . Digits
              or DecimalNumber . Digits ExponentPart
              or DecimalNumber ExponentPart
DecimalNumber = 0 //0
             or OneToNine Digits // 1-9
ExponentPart = e Exponent
            or E Exponent
Exponent = Digits
        or + Digits
        or - Digits
Digits = Digit
      or Digits Digit
Digit = 0 through 9//0-9
OneToNine = 1 through 9//1-9

JSONString

JSONString = ""
          or " StringCharacters "

StringCharacters = StringCharacter
                or StringCharacters StringCharacter

StringCharacter = any character
                  except " or \ or U+0000 through U+001F
               or EscapeSequence  //任意字符,除了 "  或者  \   或者 U+0000 - U+001F 或者  转义序列

EscapeSequence = \" or \/ or \\ or \b or \f or \n or \r or \t
or \u HexDigit HexDigit HexDigit HexDigit
 // \" 或者 \/ 或者 \\ 或者 \b 或者 \f 或者 \n 或者 \r 或者 \t 或者 \u HexDigit HexDigit HexDigit HexDigit 16进制数字

HexDigit = 0 through 9//0-9
            or A through F //A-F
            or a through f //a-f        

JSONObject

JSONObject = { }
          or { Members }
Members = JSONString : JSON
       or Members , JSONString : JSON

JSONArray

JSONArray = [ ]
         or [ ArrayElements ] //数组元素
ArrayElements = JSON
             or ArrayElements , JSON

 

无效的空格可能存在于JSONNumber(数字必须不包含空格)或JSONString(其中它被解释为字符串中的相应字符,否则将导致错误)之外的任何位置。

制表符(U+0009),回车(U+000D),换行(U+0020)和空格(U+0020)字符是唯一有效的空格字符。

 

 

参考:

mdn: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/JSON

posted @ 2018-01-07 19:03  qiqi715  阅读(451)  评论(0编辑  收藏  举报