Exjson高性能的JSON解析库

@心欲无痕  July 19, 2019

什么是 Exjson?

Exjson是一款高性能的基于Bison & Flex 的JSON解析器,相比JSON而言,增加了几个特性,如下所示

  1. 支持注释,Exjson中注释使用 # 或者 // 开头
  2. 支持如下特殊符号,nullfalsetrueonoff
特殊符号含义解析结果是否支持反序列化
true布尔值:真整型值 1支持
false布尔值:假整型值 0支持
on开启整型值 1不支持
off关闭整型值 0不支持
null整型值 0支持

APIs

// 生成一个EXJSON对象
EXJSON_API EXJSON * INIT_EXJSON();

// 生成一个 string: long int 的键值对
EXJSON_API int add_object_int(EXJSON *exjson, char *key, long val);

// 生成一个 string: double 的键值对
EXJSON_API int add_object_double(EXJSON *exjson, char *key, double val);

// 生成一个 string : string 的键值对
EXJSON_API int add_object_string(EXJSON *exjson, char *key, char *val);

// 生成一个 string: {} 的键值对
EXJSON_API int add_object_object(EXJSON *exjson, char *key, void *val);

// 生成一个 string: [] 的键值对
EXJSON_API int add_object_array(EXJSON *exjson, char *key, void *val);
// 上面添加方法的一个通用函数
EXJSON_API int add_object_ptr(EXJSON *exjson, char *key, void *val, unsigned char val_type);

// 生成一个 long int 的一个数组元素
EXJSON_API int add_array_int(EXJSON *exjson, long val);

// 生成一个 double 的一个数组元素
EXJSON_API int add_array_double(EXJSON *exjson, double val);

// 生成一个 string 的一个数组元素
EXJSON_API int add_array_string(EXJSON *exjson, char *val);

// 生成一个 对象{} 的一个数组元素
EXJSON_API int add_array_object(EXJSON *exjson, void *val);

// 生成一个 数组的 的一个数组元素
EXJSON_API int add_array_array(EXJSON *exjson, void *val);
// 上面方法的通用函数
EXJSON_API int add_array_ptr(EXJSON *exjson, void *val, unsigned char val_type);

// 打印 EXJSON 信息
PRINT_EXJSON(exjson);

// 从 EXJSON结构中获取数据
EXJSON_API void *exjson_get_val_from_key(EXJSON *exjson, char *key);
EXJSON_API void *exjson_get_val_from_index(EXJSON *exjson, int index);

// 编码JSON字符串为EXJSON结构
EXJSON_API extern EXJSON *decode_json(char *json_string);
// EXJSON结构解码为JSON字符串(返回的字符串记得free释放内存)
EXJSON_API char *encode_json(EXJSON *exjson);
// 使用完毕后,需要释放内存
EXJSON_API void destroy_exjson(EXJSON *exjson);

示例-编码Exjson

#include <stdio.h>
#include "exjson.h"


int main(int argc, char *argv[])
{
    EXJSON *exjson = INIT_EXJSON();
    
    EXJSON *array = INIT_EXJSON();
    add_array_string(array, "Exjson");
    add_array_string(array, "1.0.0");
    add_array_string(array, "Very fast");
    
    add_object_array(exjson, "exjson", array);
    
    char *str = encode_json(exjson);
    printf("%s", str);
    free(str);
    destroy_exjson(exjson);
    destroy_exjson(array);
    
    // 输出如下
    // {"exjson":["Exjson","1.0.0","Very fast"]}
    return 0;
}

示例-解码Exjson

#include <stdio.h>
#include "exjson.h"


int main(int argc, char *argv[])
{
    EXJSON *v = decode_json("{\n"
                            "    \"b\": 100, # 这个是注释\n"
                            "    \"a\":{\n"
                            "        \"a\": \"b\"\n"
                            "    }\n"
                            "}");
    // 找到a对象里面a的值
    char *value = exjson_get_val_from_key(exjson_get_val_from_key(v, "a"), "a");
    printf("a:%s", value);
    
    destroy_exjson(v);
    return 0;
    // 输出如下:
    // a:b
}

如果各位使用了本类库,发现了问题,可以及时通过[Gitee][1] 联系我,进行issue,我会及时解决的。感谢。


添加新评论