Skip to content

workflow框架内置json解析器啦 #815

@Barenboim

Description

@Barenboim

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

json value相关接口

/* 解析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相关接口

/* 返回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相关接口

/* 返回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

Metadata

Metadata

Assignees

No one assigned

    Labels

    documentationImprovements or additions to documentationenhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions