近期工作主要是写已有代码的单元测试,通过这种方式快速熟悉部门的项目。最近在code时需要对json数据进行解析和封装,借此对有关json数据的格式、解析操作等知识进行归纳整理。
json数据
json 全称是 “JavaScript Object Notation”,意为JavaScript的对象表示法。json是js的原生内容,现在已经广泛应用于数据交换和表达,已经发展成为一种独立于编程语言以外的存储和交换文本信息的语法规则。
常见的应用比如在后端将一个对象转换为json格式的数据再传给客户端解析为客户端需要的数据。
作为一种表达和交换文本信息的语法规则(类似的还有二进制文件、xml文件等),json的优点是:
- 轻量化
- 易于机器和人阅读、解析
- 独立于语言和操作系统
json数据格式
json文件支持六种基本数据类型作为它的value;
- string
- number:整数或者浮点数,整数最多15位,小数最多17位
- array:用[ ]括起来,可嵌套
- true、false:布尔类型
- null:空值
- object:对象,用{ key:value }键值对的方式表示,可嵌套
上述六种数据类型中,array和object可嵌套,事实上,常见的应用较多的json文件大多都是由不同的array和object嵌套组合而成的。
以下是json数据的demo实例:
-
json表示数字
2.91 -
json表示字符串
“Hello World” -
json表示对象,key-value
{
“name”:“smith”.
“age”:30,
“sex”:“男”
} -
对象中嵌套对象
{
“name”:“smith”.
“age”:28,
“sex”:“男”
“school”:{
“sname”:“南京大学”.
“address”:“南京市鼓楼区汉口路22号”
}
} -
表示数组
[“smith”,1001,“clerck”,7788,2000.00,200.0] -
数组中嵌套数组
[
[“smith”,1001,“clerck”,7788,2000.00,200.0]
[“smith”,1001,“clerck”,7788,2000.00,200.0]
[“smith”,1001,“clerck”,7788,2000.00,200.0]
] -
数组中嵌套对象
[
{
“title”:“Java 开发”,
“edition”:3,
“author”:[“smith”,“张三”,“李四”]
},
{
“title”:“Web 开发”,
“edition”:3,
“author”:[“Allen”,“王五”,“赵六”]
}
] -
对象中嵌套数组
{
“title”:“Web 开发”,
“edition”:3,
“author”:[“Allen”,“王五”,“赵六”]
}
C++对json进行解析的相关操作
部门项目的已有代码中利用jsoncpp这个开源库来对json数据进行相关的操作。
这里简要记录一下自己使用jsoncpp进行解析操作的过程,并不涉及对这个库的设置引入等操作。
- 使用jsoncpp包
#include “json/json.h”
jsoncpp中使用较为频繁的是:Value、Reader、Writer。
Json::Value 只能处理 ANSI 类型的字符串,如果 C++ 程序是用 Unicode 编码的,最好加一个 Adapt 类来适配。
利用jsoncpp可以通过字符串或者文件来解析json,code示例如下:
- 从字符串解析
const char* str = "{\"uploadid\": \"UP000000\",\"code\": 100,\"msg\": \"\",\"files\": \"\"}";
Json::Reader reader;
Json::Value root;
if (reader.parse(str, root)) // reader将Json字符串解析到root,root将包含Json里所有子元素
{
auto upload_id = root["uploadid"].