这是一个基于我自己写的hmfocx库来写的一个可以解析Json文本的工具库
由于此项目具备依赖, 所以先通过CMake来获取后才能使用该库
配置好CMake之后复制如下代码到一个C/C++文件中
#if defined(__cplusplus)
extern "C" {
#include <flJson.h>
}
#else
#include <flJson.h>
#endif
int main()
{
flJson* info = flJsonObject_New();
flJson* author = flJsonString_New("Flmpx");
flJsonObject_Add(info, "author", author);
char* str = flJson_Dump(info);
printf("%s\n", str);
flJson_UnRef(info);
flJson_UnRef(author);
free(str);
return 0;
}运行结果大概是这样
{"author":"Flmpx"}采用的是经典的include和src目录
.
├── CMakeLists.txt # CMake构建静态库
├── README.md # 简介
├── CHANGELOG.md # 版本变更
├── docs
│ ├── function.md # 函数文档
│ ├── develop.md # 开发文档
│ └── user.md # 使用文档
├── include
│ └── flJson.h # 头文件
├── src
│ ├── flJson.c # 构建一个Json树的实现代码
│ ├── flJsonDump.c # Json树转字符串的实现代码
│ └── flJsonParse.c # 字符串转Json树的实现代码
└── test
├── README.md # 测试相关简介
├── grammar # 语法测试
└── speed # 速度测试采用每种类型占据一个位(bit)的方式, 在判断flJson类型的时候可以同时判断多种
enum flJsonType {
flJsonTypeLL = 1L << 0, // 整型
flJsonTypeDouble = 1L << 1, // 浮点型
flJsonTypeString = 1L << 2, // 字符串型
flJsonTypeNull = 1L << 3, // 空
flJsonTypeBool = 1L << 4, // 布尔型
flJsonTypeObject = 1L << 5, // 对象
flJsonTypeArray = 1L << 6 // 数组
};由于直接使用hmfocx, Json中的 valArray_ 和 valObject_ 分别来自于 hmfocx 的 hm_arr 和 hm_map
为了不把过多的hmfocx容器的相关实现细节展示出来, 关于数组和对象的内嵌结构体只保留了必要的数据(大小数据和指针)
struct flJson {
flJsonType type_; // Json的类型标志
union {
long long valLL_; // 存整数
double valDouble_; // 存浮点数
char* valString_; // 存字符串指针
bool valBool_; // 存布尔类型
/* 存数组 */
struct {
void** array_; // 存着Json指针的数组
size_t size_; // 元素数目
size_t cap_; // 容量
} valArray_;
/* 存对象 */
struct {
void* entrys_; // 存key和json的entry数组
int* status_; // 桶状态信息
size_t size_; // 元素数目
size_t cap_; // 容量
} valObject_;
};
size_t refCount_; // 引用计数, 当为0时即是释放内存时机
};全局有flJson, flJsonObjectIter 和 flJsonArrayIter 这三个结构体, 由于并不需要过度了解结构体内部的字段, 我相信会很容易使用
在 CMakeLists.txt 文件中添加下面代码
# ...
include(FetchContent)
FetchContent_Declare(
flJson
GIT_REPOSITORY https://github.com/Flmpx/flJson.git # or git@github.com:Flmpx/flJson.git
GIT_TAG v0.2.0
)
FetchContent_MakeAvailable(flJson)
# ...
target_link_libraries(your_executable PRIVATE flJson)然后就是最常见的CMake构建流程了
# 创建build文件夹
mkdir build
# 进入build文件夹
cd build
# CMake构建
cmake .. # 如果要使用ssh进行拉取flJson所依赖的库, 开启选项 FLJONS_USE_SSH_FOR_GIT
# 执行Makefile文件
make