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

1.2 数值

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

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

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

正确写法:去除数字前0

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

你真的了解JSON吗?的更多相关文章

  1. ajax 接收json数据的进一步了解

    var url = "../searchclasses"; $.ajax({ url: url, type: "post", dataType: "j ...

  2. 【NodeJS线程】Boss和他的职员们

    >>>[说明]还是一如既往的,这篇文章是从我的个人博客里挪过来的.原文参见:http://www.jscon.co/coding/frontend/nodejs_fork_child ...

  3. 零基础如何自学java开发?

    开篇直奔主题,java 学习个人感觉分为两种途径,第一种是在学校,在培训机构等地方学习. 有人指导:第二种是自学,通过视频,书籍,朋友等完成学习. 本文适合 自学,且基础薄弱或者无基础的人.先介绍下我 ...

  4. day67 前后端数据交互

    目录 一.前后端传输数据的编码格式(contentType) 1 form表单 2 ajax请求 二.ajax发送json格式数据 三.ajax发送文件 四.django自带的序列化组件(drf做铺垫 ...

  5. JS对JSON对象遍历输出的时候真的是按照顺序输出吗?

    对象的遍历输出并不是按照对象属性定义顺序来的,那么是按照什么规则来的呢,仔细深入研究你会发现,这还跟浏览器有关系,Chrome跟IE是不一样的,所以给出以下结论: Chrome Opera 的 Jav ...

  6. 【面试题】JSON.stringify()妙用,你真的知道吗?

    JSON.stringify()妙用 点击打开视频讲解更加详细 语法:JSON.stringify(value, replacer , space) value:将要序列化成 一个JSON 字符串的值 ...

  7. 一个粗心的Bug,JSON格式不规范导致AJAX错误

    一.事件回放  今天工作时碰到了一个奇怪的问题,这个问题很早很早以前也碰到过,不过没想到过这么久了竟然又栽在这里. 当时正在联调一个项目,由于后端没有提供数据接口,于是我直接本地建立了一个 json ...

  8. 用原始方法解析复杂字符串,json一定要用JsonMapper么?

    经常采集数据,肯定会碰到解析字符串,包括整个页面的html,或者json以及一些不标准的json格式... 以前用json序列化,有时候需要实体类,有的时候没有,比较麻烦,听说可以用JsonMappe ...

  9. 阶段一:通过网络请求,获得并解析JSON数据(天气应用)

    “阶段一”是指我第一次系统地学习Android开发.这主要是对我的学习过程作个记录. 在上一篇阶段一:解析JSON中提到,最近在写一个很简单的天气预报应用.即使功能很简单,但我还是想把它做成一个相对完 ...

随机推荐

  1. PHP路径指定web路径的方法

    PHP路径指定web路径的方法直接在/前面加.就是代表web路径了 不是按照文件路径来算了 <pre>./Public/uploads/suolutu/' . $suijishu . '_ ...

  2. Xshell选中的同时把内容复制到剪贴板

    1.设置对话框 工具 -> 选项 -> 键盘和鼠标 -> 将选定的文本自动复制到剪贴板 2.贴图如下 2.1.打开设置对话框 2.2.设置键盘鼠标,左键复制

  3. thinkphp6.0 开启调试模式以及Driver [Think] not supported

    thinkphp6.0 开启调试模式 首先确认自己是通过 composer 进行的下载,然后修改系统目录下的 .example.env 为 .env 文件 修改 config->app.php ...

  4. nyoj 257 郁闷的C小加(一)(栈、队列)

    郁闷的C小加(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 我们熟悉的表达式如a+b.a+b*(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说 ...

  5. 系统信息命令(uname、dmesg、df、hostname、free)

    uname 显示计算机及操作系统相关的信息,uname -a显示全部信息,uname -r内核的发行号,各种信息可以有单独的选项分别指出 [lixn@Fedora24 ~]$ uname -a Lin ...

  6. linux网络测试命令

    一.ping 它通过向目标主机发送一个个数据包以及接受数据包的回应来判断主机和目标主机之间网络连接情况.ping的两个功能:判断网络是否可达.网络性能统计. ping使用的是网络层的ICMP协议. p ...

  7. 学习记录:《C++设计模式——李建忠主讲》4.“单一职责”模式

    单一职责模式:在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任. 典型模式:装饰模式(Decorator).桥 ...

  8. convert svn repo to git

    https://john.albin.net/git/convert-subversion-to-git 1. 抓取Log 在linux 上做的,其余是在win上做的. 2. svn co svn:/ ...

  9. 【论文阅读】The Contextual Loss for Image Transformationwith Non-Aligned Data(ECCV2018 oral)

    目录: 相关链接 方法亮点 相关工作 方法细节 实验结果 总结与收获 相关链接 论文:https://arxiv.org/abs/1803.02077 代码:https://github.com/ro ...

  10. Spring security (一)架构框架-Component、Service、Filter分析

    “致"高级"工程师(BUG工程师) 一颗折腾的心