Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

广义与狭义的JSON

  JSON 的概念本身是很广的,它不仅可以是一个对象,一个数组,还可以是一些原始类型。但狭义的 JSON 指的却只是最外层为对象的 JSON。而且在一些封装中限制了只能使用狭义的 JSON。虽然没有规范约束,但狭义的 JSON 确实更便于使用,至少不需要做多余的类型判断。

广义的JSON

  JSON不仅可以存储对象,还支持原始类型,即使只是一个数字,它也算是 JSON: JSON.parse("123");   不仅是数字,JS 中的三大原始类型都属于 JSON 的范畴。

狭义的JSON

  我的 API 设计是期望让服务器总是响应 JSON 数据,但要是服务器直接给我响应一个字符串或一个数字的话我也会很困扰。要是每个 API 响应的数据类型不同,话前端程序就需要做额外的类型判断,这会是糟糕的设计。所以 JSON 太灵活了反而不好用,我们在 JSON 的基础上再限制一部分用法,把它定义成狭义的 JSON 后再使用。

在哪儿可以看到它?

  其实狭义 JSON 的概念已经很普遍,在 JSON 作为数据传输用途时几乎都采用了狭义 JSON 来限制类型的不规范。比如原生的 表单 JSON 支持,最终提交的也是一个狭义的 JSON。还有许多前端框架在数据传输时对 JSON 的封装也仅限于狭义 JSON。
  结构化数据总是一个对象,而需要使用 JSON 传输的通常都是结构化数据,所以 JSON 自然就衍生出了这种用法。
  其实我这么说有点本末倒置了,最初的 JSON 确实只是对象而已,后来才有的原始类型支持。所以很多古老的 JSON 解析器都无法完全解析目前规范中所定义的 JSON 数据。

其它坑

  就算我说是狭义,本来也是没有具体定义的,只是大家都不喜欢在传输时使用原始类型而已。但除了原始类型外还有个奇怪的东西,那就是数组。在 JS 中数组确实属于对象,但是JSON中数组是和对象平级的东西。对于是否允许直接使用数组目前来看还是很换乱的,比如 Angular 的 $resource,要是服务器响应的是数组就会出问题。

网名:
3.84.186.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^