引言
JSON,全称 J avaS cript O bject Notion,类似于XML,YAML,Properties等,是一种数据交换格式,相比于XML,更简单,更轻量,更容易理解。

JSON vs XML
使用
JSON 目前被广泛作为 Web 开发中前后端数据的交换格式(尤其是 Rest API 中)。
例如百度:

百度
例如b站:

bilibili
除此以外,JSON 还经常作为配置文件的格式。
如 VsCode的配置文件:

VScode Settings
如 Eslint 的配置文件:

Eslint Settings
JetBrains 公司新发布的 Fleet IDE 也使用 JSON 作为配置文件:

Fleet Settings
优点
总体来说,JSON具有两个优点:
第一,语法十分简单,如下面这个例子:
{
"name": "古月有三木",
"university": "whu",
"gender": "男",
"isProgrammer": true
}
不论是开发者还是使用者,都很容易理解这个信息。
同时,又因为 JSON 是 Javascript 的子集,所以前端开发者几乎可以无痛上手,这也是 JSON 被广泛用于前后端数据交换的原因之一。
第二,得益于 JSON 的简洁,相对于 XML,编写一个 JSON 解析器就容易的多,事实上,目前几乎所有流行的编程语言都提供了对 JSON 的解析。
数据类型
JSON 支持以下几种数据类型:
-
String,字符串类型,强制为 UTF-8 编码
-
Number,数值类型,支持整数、浮点数、科学计数法
-
Boolean,布尔类型,true/false
-
Null,空值
-
Array,数组,数组的值可以为 String, Number, Boolean, Null, Array 或者 Object
-
Object,对象类型,对象的键必须为字符串,值可以为六种类型之一。
Object
Object 是键值对的集合,格式为:

Object, from json.org
其中键必须为字符串,值可以为六种类型之一,注意,键和值之间需要使用 :
隔开,不同键值对之间需要使用 ,
隔开,但最后一个键值对后不能加 ,
。
Array
Array 是值的有序列表,格式如下:

Array, from json.org
其类似于编程语言中的数组,值可以为六种类型之一,不同值之间需要使用 ,
隔开,但最后一个值后面不能添加 ,
。
实际使用
上文已经提到,目前大多数主流语言均提供对 JSON 的解析,下面我们看几个例子。
JavaScript
JavaScript 提供了对 JSON 的原生解析方法。
const jsonStr = `
{
"name": "Civitasv",
"university": "Whu",
"age": 22,
"gender": "M",
"isProgrammer": true
}
`
const jsonObject = JSON.parse(jsonStr) // 使用 Json.parse 解析 Json 字符串
Object.keys(jsonObject).forEach(item => {
console.log(item, ": ", jsonObject[item])
})
console.log("==============================")
const toJsonStr = JSON.stringify(jsonObject) // 使用 Json.stringfy 将 json 对象输出为 json 字符串
console.log(toJsonStr)
Python
Python 中的 json
库提供了对 JSON 的解析方法。
import json
jsonStr = """
{
"name": "Civitasv",
"university": "Whu",
"age": 22,
"gender": "M",
"isProgrammer": true
}
"""
jsonObject = json.loads(jsonStr) // 使用 json.loads 将 json 字符串解析为 python 对象
for item in jsonObject:
print("{}: {}".format(item, jsonObject[item]))
print("==============================")
toJsonStr = json.dumps(jsonObject, ensure_ascii=False) // 使用 json.dumps 将 python 对象解析为 json 字符串
print(toJsonStr)
C++
C++ 中有许多的 JSON 解析库,使用 nlohmann 的 json 库介绍如下。
#include "json.hpp"
#include <string>
#include <iostream>
using json = nlohmann::json;
int main()
{
std::string jsonStr = R"(
{
"name": "Civitasv",
"university": "Whu",
"age": 22,
"gender": "M",
"isProgrammer": true
}
)";
json jsonObject = json::parse(jsonStr); // 使用 json::parse 解析 json 字符串
for (auto &[key, value] : jsonObject.items())
{
std::cout << key << ": " << value << "\n";
}
std::cout << "==============================" << '\n';
std::string toJsonStr = jsonObject.dump(); // 使用 dump 方法将 json 对象解析为字符串
std::cout << toJsonStr << '\n';
}
结语
以上是对 JSON 数据格式以及使用方法的介绍,本质上说,JSON 只是具有一定格式的字符串,但编写方和使用方遵循相同的规范,就可以实现数据的交换了,所以,JSON 解析器就显得十分重要,我将在未来的文章中具体介绍如何使用 C++ 编写一个基本的 JSON 解析器,对此感兴趣的可以先看一下代码。
参考资料
1
A Tiny Json Parser: https://github.com/Civitasv/mini-json-parser
作者:古月有三木