JSON介绍

Posted by Hsz on June 2, 2021

JSON介绍

JSON是一种广泛使用的半结构化序列化协议,广泛使用于前后端通信,半结构化数据保存,项目配置等领域.由于其应用极广,所以几乎每门相对现代些的编程语言中都会有用于解析它的标准库.因此其使用起来学习成本很低.在数据科学领域中JSON也是最常见的数据序列化形式之一.

JSON的表现形式

一个典型的JSON数据如下:

{
    "name":"小明",
    "age":18,
    "gender": "male"
}

JSON中的类型

JSON来自于javascript,因此值类型也沿用javascript中的定义.JSON中定义的数据类型包括boolean,string,number,null,arrayobject.其中boolean,string,number,null是最基本的数据类型,而arrayobject则是容器结构.广义上来说只要数据是上面的任意一种类型的都是满足定义的JSON数据,但一般JSON数据都是arrayobject的形式.需要注意的是和js中不同,object键必须是string.

  • object使用{}包裹,里面是键值对的形式

      { "key1": "value1", "key2": "value2" }
    
  • array使用[]包裹,里面是成员对象

      [ "first", "second", "third" ]
    
  • number在JSON中也不区分整数和浮点数

      42
      3.1415926
    
  • string在JSON中字符串只能使用""包裹

      "This is a string"
    
  • boolean在JSON中布尔型数据只有两个取值,既truefalse

  • null在JSON中统一使用null表示空值

JSON的性能特点和适用范围

JSON是基于文本的序列化协议,这也意味着它序列化后数据会比较大,同时由于它无固定schema,因此相对的比较灵活可读,同时一般序列化和反序列化速度会相当快.JSON非常适合用在调试阶段,在业务未定型时使用JSON可以大大降低后期由于数据结构定义修改造成的时间和人力投入;但另一个角度来说,由于无固定schema,灵活性会带来维护上的额外成本,一旦没有跟上代码管理很容易造成一些维护上的麻烦.

使用messagepack代替JSON

在作为序列化协议方面,一种渐进式的方案是在业务稳定后使用msgpack代替json充当序列化协议.msgpack可以看作是二进制版本的JSON,它的序列化结果是二进制数据而非纯文本,同时由于对结构进行了额外优化,messagepack序列化后的结果会小很多,基本可以接近protobuffer.当然代价是messagepack的序列化和反序列化会慢一些.在我们需要无固定schema形式的的序列化协议时msgpack是一个好选择

使用YAML代替JSON

在作为配置配置文件格式方面,通常我们会用YAML来代替JSON,这是因为YAML可以完全包含JSON的信息,同时可以通过引用语法提取出重复部分以减少大量代码.Docker-compose,OpenAPI等知名项目都使用YAML.