• 你真的了解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 = '"u2028u2029"';
    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  or f or 
     or 
     or 	
    or u HexDigit HexDigit HexDigit HexDigit
     // " 或者 / 或者 \ 或者  或者 f 或者 
     或者 
     或者 	 或者 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

  • 相关阅读:
    sql-lib闯关秘籍之1-10关
    简单的SQL注入
    五分钟带你读懂 TCP全连接队列(图文并茂)
    Ambari HDP集群搭建全攻略
    Spring Cloud Security OAuth2.0 认证授权系列(入门篇)
    敲黑板:InnoDB的Double Write,你必须知道
    重要,知识点:InnoDB的插入缓冲
    你不知道的内存知识
    每日一个知识点:关于磁盘的一些事儿
    Spring Boot 系列:日志动态配置详解
  • 原文地址:https://www.cnblogs.com/qiqi715/p/8229178.html
Copyright © 2020-2023  润新知