#815·workflow

workflow框架内置json解析器啦

Author: BarenboimCreated Mar 19, 2022Updated May 6, 2025
Labelsdocumentationenhancement

为了支持内置的consul client,项目里实现了基于标准C(C99)的高性能JSON解析器。

json value相关接口

c
/* 解析json文档产生json value。返回json value对象。返回NULL代表解析失败(格式不标准,嵌套过深,分配内存失败)
   @doc 文档字符串 */
json_value_t *json_value_parse(const char *doc);

/* 销毁json value
   @val json value对象。一般由parse函数产生。*/
void json_value_destroy(json_value_t *val);

/* 返回json value类型
    可能的返回值:
    JSON_VALUE_STRING:字符串
    JSON_VALUE_NUMBER:数字
    JSON_VALUE_OBJECT:json对象
    JSON_VALUE_ARRAY:json数组
    JSON_VALUE_TRUE:true
    JSON_VALUE_FALSE:false
    JSON_VALUE_NULL:null
   @val:json value对象 */
int json_value_type(const json_value_t *val);

/* 获得json string。返回string地址。如果返回NULL,代表value不是STRING型。
   @val:json value对象 */
const char *json_value_string(const json_value_t *val);

/* 获得json number。返回数值。如果value不是NUMBER型,返回NAN(不存在的浮点数)。
   @val:json value对象 */
double json_value_number(const json_value_t *val);

/* 获得json object。返回object对象。如果value不是OBJECT类型,返回NULL。
   @val:json value对象
   注意返回的json_object_t指针并非const。可以通过build相关函数扩展object。*/
json_object_t *json_value_object(const json_value_t *val);

/* 获得json array。返回array对象。如果value不是ARRAY类型,返回NULL。
   @val:json value对象
   同样,返回的json_array_t指针不带const。 */
json_array_t *json_value_array(const json_value_t *val);

json object相关接口

c
/* 返回object的大小。即object包含的name,value对数量。
   @obj:json object对象 */
int json_object_size(const json_object_t *obj);

/* 查找name下的value。返回json value对象。返回NULL代表找不到这个name。函数时间复杂度为O(size)。
   @name:要查找的名字
   @obj:json object对象
   注意返回的json_value_t指针带const。*/
const json_value_t *json_object_find(const char *name, const json_object_t *obj);

/* 遍历json object。
   @name:临时的const char *类型name字符串
   @val:临时的const json_value_t *类型的json value对象
   @obj:json object对象
   这不是一个函数,是一个展开成一个for循环的宏。 */
json_object_for_each(name, val, obj)

json array相关接口

c
/* 返回json array的大小,即元素个数。
   @arr:json array对象 */
int json_array_size(const json_array_t *arr);

/* 遍历json array
   @val:临时的const json_value_t *类型的json value对象
   @arr:json array对象
   同样,这是一个展开成for循环的宏。 */
json_array_for_each(val, arr)

build接口

请直接参考源代码。

示例

使用示例大家可以到这个独立repo上看一下: https://github.com/barenboim/json-parser 目前workflow的master分支,包括了这个json paser。所以,只需在代码里直接引用就可以了。

Benchmark

实测parse性能大概是cJSON的2倍,jsoncpp的15倍左右。大部份常规JSON文档解析速度优于rapidjson