JSON学习的误区

2020-02-06大约11分钟

我们先来回顾一下,JSON的全名是JavaScript Object Notation(JavaScript对象表示法),跟JavaScript有关,这就很容易带来一些误解:

  1. JSON就是JavaScript对象
  2. JSON在JavaScript里序列化、反序列化是不花时间的

我们来逐个分析一下。

误解1: JSON就是JavaScript对象

网上经常可以看到一些流行的网站,在介绍JSON的时候,就给大家来这么一段程序例子:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>xx教程</title>
</head>

<body>
    <h2>JavaScript 创建 JSON 对象</h2>
    <script>
        var JSONObject = {
            "name": "xx教程",
            "url": "www.xx.com",
            "slogan": "学的不仅是技术,更是梦想!"
        };
        document.getElementById("jname").innerHTML = JSONObject.name
        document.getElementById("jurl").innerHTML = JSONObject.url
        document.getElementById("jslogan").innerHTML = JSONObject.slogan
    </script>

</body>

</html>

里面直接创建一个JavaScript对象,命名成JSONObject,然后对这个对象做一堆属性访问操作。这是明确在告诉学习者:JavaScript对象,就是JSON对象,不是吗?

这是一个严重的理解错误。前面说过,JSON是一种轻量级的数据交换格式 ,不是某个编程语言里的对象。如果是JavaScript对象,对象是程序运行时才会创建的,那么别的语言如Python、Go语言怎么拿到这个对象呢?理解这个,核心是要理解JSON是一种数据格式,本质上只是一些字符内容,和XML一样,都是文本形式存在的。因为是文本内容,格式又很简单,那么不同的语言就可以很容易解析,将其转换成自己语言内部的对象。

JSON数据格式,主要是借鉴了JavaScript代码里对象的表示形式,并且从格式上两者也并不是完全兼容的。比如:

  • 对象的属性名,JSON里必须用双引号" ";JavaScript里,只要符合变量规范,可以用也可以不用单引号' '或双引号'' "
  • 字符串,也必须用双引号" ";JavaScript里,可以用单引号' '或双引号'' "

还有一些其他的区别,具体请看JavaScript 与 JSON 的区别

因此,JSON和JavaScript里面的Object是完全不同的,不要混为一谈。

误解2:JSON在JavaScript里序列化、反序列化是不花时间的

之所以会误解,本质原因还是把JSON直接理解为JavaScript对象,那么其实根本不需要序列化、反序列化的,所以就不会花时间。上面的误解澄清了之后,那么就比较好理解这个问题了。

既然JSON是一种文本格式,那么任何文本读到JavaScript里也只是一个字符串,具体是什么内容的,还是需要合适的解析方式来处理。

比如JavaScript里提供了JSON.stringify()来把JavaScript对象转成JSON格式,和JSON.parse()来把JSON转成JavaScript对象。

const obj = {
    "name": "Joy", 
    "age": 20, 
    "married": false
};
const jsonData = JSON.stringify(obj);
console.log(`JSON数据:${jsonData}`);

const newObj = JSON.parse(jsonData);
console.log(`JS对象:${newObj}`);
JSON解析是要耗费程序的执行时间的,1MB的JSON数据的解析可能要花几十、甚至几百毫秒的时间,这段时间完全是CPU密集型的操作,会阻塞JavaScript进程处理其他任务。因此,即使不考虑网络传输带宽占用,JSON的数据也是越小越好。