json-tutorial

敖炜 Lv5

json-tutorial

JSON转义

JSON基础

JSON语法

  1. 数据在名称/值对中
  2. 数据由逗号分隔
  3. 花括号保存对象
  4. 方括号保存数组

名称/值对

1
2
3
4
5
6
7
8
9
10
11
{
"virtualeNB":[
{"virteNBName":"virt1", "virteNBNum":5, "begineNBID":0, "beginCtlPort":6000, "beginDataPort":7000, "virtIPNum":5},
{"virteNBName":"virt2", "virteNBNum":10, "begineNBID":10, "beginCtlPort":6000, "beginDataPort":7000, "virtIPNum":10}
],
"eRAN":[
{"eRANName":"eNB1", "eRANID":3002, "ctlPort":36412, "dataPort":2152},
{"eRANName":"eNB2", "eRANID":10000, "ctlPort":36412, "dataPort":2152}
]
}

JSON数据的书写格式是 名称: 值

值的类型有以下几种

  • 数字(整数或浮点数):外面无双引号
  • 字符串:在双引号中
  • 逻辑值:true或false
  • 数组:在方括号中
  • 对象:在花括号中
  • null

言归正传

那么在解析JSON字符串时,为什么需要考虑转义字符呢?

  • 因为在许多编程语言和JSON中, “ (双引号)被作为了字符串的分界符。为了在这些编程语言中表示字符串中本身就存在 “ (双引号),我们就需要配合转义字符,在字符串中用 " 的形式表示字符串中本身存在的 “

  • 同时,对于一些不可打印的控制符(如换行、制表、回退等),我们也利用 \ 加上一些特定字母的形式,来表示它们

  • 我们在读入JSON中的值时,是将其以字符串的格式读入。JSON中number、Boolean等值没有双引号包裹,读入后直接判断其第一个字符即可。

  • 但是对于JSON中的字符串类型的值,其本身就有双引号包裹,将其以字符串格式读入并解析时,第一个字符便是 “ ,结尾的字符也是 “ ,因此我们判断第一个字符为 “ 时,说明我们在解析一个字符串值

下面这个例子是说,有一个评论文本,其值为字符串,但是,字符串中我们想要用 “KFC” 来表示我对于KFC的引用。这段字符串被读入并解析时,将无法被理解,当我们解析到第二个 “ 时,解析程序就会认为这个字符串结束了,显然解析出来的结果是不对的。

1
{"review_text": " "KFC" is so good!"}

解决方案就是

1
{"review_text": " \"KFC\" is so good!"}

此时"用于表示我们在字符串中出现了 “ ,而不是表示字符串的结束,但是这里JSON中的 \ 和 “ 是两个字符。当我们解析到 \ 时,说明此处有一个转义序列,我们就可以正确地解析出字符串内容或控制符

同理下面是JSON常用的转义序列:

\“: 表示双引号 “
\: 表示反斜杠 \
\/: 表示斜杠 /
\b: 表示退格符
\f: 表示换页符
\n: 表示换行符
\r: 表示回车符
\t: 表示制表符

字符编码

ASCII码

ASCII一共规定了128个英语字符与二进制位之间的关系(包括32个不能打印出来的控制符号),只占用了7个比特,最前面一位统一规定为0

非ASCII编码

一些欧洲国家为了表示其字符,决定利用字节中闲置的最高位编入新符号。各个国家0-127表示的符号都一致,但是128-255这一段却不一致

但是一个字节显然无法表示如汉字在内的文字,必须使用多个字节,如简体中文最常见的编码方式是GB2312,使用两个字节表示一个汉字

Unicode

由于编码方式的不统一,对于一个文本文件,如果不知道其编码方式,则无法正确解读其内容。

为了解决这个问题,Unicode联盟建立了,并且不断收录全世界的字符进入统一字符集(Universal Coded Character Set, UCS),每个字符映射到一个整数码点(code point),码点的范围是0至0x10FFFF,又通常记作U+XXXX,其中XXXX为16进制数字。

此时,Unicode及UCS只收录了符号集,只规定了符号的二进制代码,却没有规定这个二进制代码如何存储。

存储中涉及很多问题:

  1. 例如需要三个字节存储的Unicode字符,就如何与ASCII字符区分,计算机如何知道这是一个Unicode字符还是三个ASCII字符。
  2. 如果Unicode统一规定,使用三个或四个字节表示,那么就会有大量的字符编码前面有多个0,造成极大的存储空间浪费。

于是Unicode便出现了多种存储方式,这些方式被称为Unicode转换格式(Unicode Transformation Format),如UTF-8、UTF-16、UTF-32,其后面的数字表示其一个编码单元的比特位数,每种UTF会把一个码点存储为一至多个编码单元。除了UTF-32,UTF-8和UTF-16都是可变长度编码

UTF-8

随着互联网的普及,大家对于编码方式的统一产生了急切的需求,UTF-8实在互联网上使用方式最广的一种Unicode的实现方式,原因如下:

  1. 采用字节位编码单元,不会有字节序(endianness)的问题
  2. 每个ASCII字符只需一个字节去存储
  3. 若程序原本是以字节方式存储字符,理论上不需要特别改动就可处理UTF-8的数据

UTF-8是一种变长的编码,可使用1-4个字节表示一个符号。其编码规则如下

  1. 对于单字节符号,字节第一位为0,后面七位为这个符号的Unicode码
  2. 对于n(n>1)字节的符号,第一个字节的前n位都为1,第n+1位为0,后面字节的前两位一律设为10。余下的二进制位,全部位这个符号的Unicode码

JSON对象

jSON对象由对象成员组成。

对象成员就是键值对,键必须是JSON字符串,值是任何JSON值,中间以冒号分隔。

  • 标题: json-tutorial
  • 作者: 敖炜
  • 创建于 : 2024-03-13 14:32:52
  • 更新于 : 2024-04-19 09:31:32
  • 链接: https://ao-wei.github.io/2024/03/13/json-tutorial/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论