# json
为了避免不同平台下的字节对齐、类型大小不统一的问题,json库把数据封装成具有一定格式的字符流数据,进行传输。
json 把数据与键值一一对应,数据传输双方约定好同一键值,使用接口API根据键值操作jason对象(jason_object)存储或取得数据。
一般流程:
数据 -> 封装成 json 对象 -> 字符串 -> 传输 -> 解析字符串 -> 解析 json 对象 -> 获取数据。
# 4.1 介绍
json-c 是一个C语言的JSON解析和生成库,可以用来解析和生成JSON格式的数据。
json-c 库提供了一组简单易用的 API,可以方便地处理JSON数据。
使用非常简单,只需要包含头文件"json-c/json.h",就可以开始使用 json-c 库的API。
# 4.2 安装
1. 准备
sudo apt install git
sudo apt install cmake
sudo apt install doxygen # optional
sudo apt install valgrind # optional
1
2
3
4
2
3
4
2. 下载并安装
$ git clone https://github.com/json-c/json-c.git
$ mkdir json-c-build
$ cd json-c-build
$ cmake ../json-c # See CMake section below for custom arguments
1
2
3
4
2
3
4
$ make
$ make test
$ make USE_VALGRIND=0 test # optionally skip using valgrind
$ sudo make install # it could be necessary to execute make install
1
2
3
4
2
3
4
3. 使用 Doxygen 生成文档
# in build directory
make doc
google-chrome doc/html/index.html
1
2
3
2
3
# 4.3 使用
使用locate 命令查看,头文件和库文件位置:
$ locate json.h
/usr/local/include/json-c/json.h
$ locate libjson-c.a
/usr/local/lib/libjson-c.a
$ locate libjson-c.so
/usr/local/lib/libjson-c.so
/usr/local/lib/libjson-c.so.5
/usr/local/lib/libjson-c.so.5.2.0
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
编译时指定链接静态库:
gcc json.c -Wall -L /usr/local/lib -l:libjson-c.a -o json
1
# 4.4 API
# 4.4.1 数据的封装
// 创建一个 json 对象
struct json_object * json_object_new_object (void);
// 创建一个 json 数组对象
struct json_object * json_object_new_array (void);
// 销毁 json 对象
void json_object_put (struct json_object *obj);
1
2
3
4
5
6
2
3
4
5
6
# 4.4.2 json 对象的转换(转换成 json 对象)
// int to json
struct json_object * json_object_new_int (int i);
// double to json
struct json_object * json_object_new_double (double d);
// string to json
struct json_object * json_object_new_string (const char *s);
// bool to json
struct json_object * json_object_new_boolean (bool b);
// string to json
struct json_object * json_object_new_string_len (const char *s, int len);
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 4.4.3 json 普通对象的处理
// 添加
void json_object_object_add (struct json_object *obj, const char *key, struct json_object *val);
// 删除
void json_object_object_del (struct json_object *obj, const char *key);
// 查询
struct json_object * json_object_object_get (struct json_object *obj, const char *key);
// 根据 key 获取
struct json_object * json_object_object_get (struct json_object *obj, const char *key);
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 4.4.4 json 数组对象处理
// 获取长度
int json_object_array_length (struct json_object *obj);
// 添加
int json_object_array_add (struct json_object *obj, struct json_object *val);
// 按位置添加
int json_object_array_put_idx (struct json_object *obj, int idx, struct json_object *val);
//获取指定位置对象
struct json_object * json_object_array_get_idx (struct json_object *obj, int idx);
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 4.4.5 json 对象转字节流
const char * json_object_to_json_string (struct json_object *obj);
1
# 4.4.6 字节流转 json
struct json_object* json_tokener_parse(const char *str);
1
# 4.4.7 普通对象获取
// 根据 key 获取
struct json_object * json_object_object_get (struct json_object *obj, const char *key);
1
2
2
# 4.4.8 数组对象获取
// 获取指定位置对象
struct json_object * json_object_array_get_idx (struct json_object *obj, int idx);
1
2
2
# 4.4.9 对象转换(数据还原)
// bool型:
bool json_object_get_boolean (struct json_object *obj);
// double型:
double json_object_get_double (struct json_object *obj);
// 整型:
int json_object_get_int (struct json_object *obj);
// 字符数组:
const char * json_object_get_string (struct json_object *obj);
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 4.5 例子
以下是一个使用 json-c 的简单示例:
#include <stdio.h>
#include <json-c/json.h>
int main() {
// 创建一个 JSON 对象
struct json_object *my_json = json_object_new_object();
// 添加一个字符串类型的键值对
json_object_object_add(my_json, "name", json_object_new_string("John"));
// 添加一个整型类型的键值对
json_object_object_add(my_json, "age", json_object_new_int(25));
// 添加一个布尔类型的键值对
json_object_object_add(my_json, "is_student", json_object_new_boolean(1));
// 打印 JSON 对象
printf("%s\n", json_object_to_json_string(my_json));
// 释放 JSON 对象
json_object_put(my_json);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
该程序创建了一个 JSON 对象,添加了三个键值对,并将其打印出来。运行该程序,输出结果如下:
{
"name":"John",
"age":25,
"is_student":true
}
1
2
3
4
5
2
3
4
5