# 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. 下载并安装

$ 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
$ 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

3. 使用 Doxygen 生成文档

# in build directory
make doc
google-chrome doc/html/index.html
1
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

编译时指定链接静态库:

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

# 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

# 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

# 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

# 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

# 4.4.8 数组对象获取

// 获取指定位置对象
struct json_object * json_object_array_get_idx (struct json_object *obj, int idx);
1
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

# 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

该程序创建了一个 JSON 对象,添加了三个键值对,并将其打印出来。运行该程序,输出结果如下:

{
    "name":"John",
    "age":25,
    "is_student":true
}
1
2
3
4
5