一. 前言

        libjson-c是一个由C语言实现的json的开源库。提供了用于操作json结构的所有的接口,满足了在C语言开发环境下需要操作json数据的需求,本文主要介绍一些库函数的使用。本文使用libjson-c-0.13版本,此版本后的都需要用cmake编译,比较麻烦,不建议使用。

二. 库函数介绍

1. struct json_object* json_object_new_object(void)

        创建一个引用计数为1的新对象。返回的json_object对该对象有唯一控制权(需要负责最后的内存空间释放)。当使用json_object_object_add或者json_object_array_put_idx时,该对象的控制权将转移到添加该对象的对象或数组。如果需要将该对象添加到其他多个对象或数组中,需要调用json_object_get(引用计数加1,后面会提到)。

2. struct json_object* json_object_get(struct json_object *jso)

        将该json_object的引用计数加1。当json_object需要被多个对象引用时,每增加一个引用对象,都需要调用该接口,为该json_object增加引用计数。

3. int json_object_put(struct json_object *jso)

        将json_object的引用计数减1,如果此时引用计数为0,则释放该json_object。

        PS:如果json_object同时被两个对象引用,但是json_object的引用计数为1,在调用json_object_put释放第一个对象后,在释放第二个对象时将会报错,因为在第一个对象释放后,json_object引用计数为0并会被释放,导致后面重复释放。

4. struct json_object* json_object_new_int(int32_t i)

        创建类型为json_type_int的新的空json_object。其实该对象内部是用64位的空间来储存数值,所以建议统一使用json_object_new_int64函数。

5. struct json_object* json_object_new_string(const char *s)

        创建类型为json_type_string的新的空json_object对象。函数内会通过strdup创建字符串的副本,内存由json_object管理。

6. struct json_object* json_object_new_boolean(json_bool b)

        创建类型 json_type_boolean 的新空json_object。

7. struct json_object* json_object_new_array(void)

        创建类型为json_type_array的新的json_object。

8. struct json_object* json_tokener_parse(const char *str)

        分析字符串,如果找到有效的 JSON 值,则返回非 NULL json_object。字符串不需要是 JSON 对象或数组;它也可以是字符串、数字或布尔值。

9. struct json_object_iterator json_object_iter_begin(struct json_object* obj)

        找到一个json_object中包含的第一个对象,保存在一个json_object_iterator中。

10. struct json_object_iterator json_object_iter_end(const struct json_object* obj)

        找到一个json_object中包含的最后一个对象,保存在一个json_object_iterator中。

11. void json_object_iter_next(struct json_object_iterator* iter)

        iter指向下一个json_object_iterator结构。

12. const char* json_object_iter_peek_name(const struct json_object_iterator* iter)

        从json_object_iterator取出该对应的json_object的name。

13. struct json_object* json_object_iter_peek_value(const struct json_object_iterator* iter)

        从json_object_iterator取出该对应的json_object的value。

案例如下:

#include

#include

#include

#include

#include

#include

int main(int argc, char *argv[])

{

struct json_object_iterator it;

struct json_object_iterator itEnd;

struct json_object* obj;

obj = json_tokener_parse("{'first':'george', 'age':100}");

it = json_object_iter_begin(obj);

itEnd = json_object_iter_end(obj);

while (!json_object_iter_equal(&it, &itEnd))

{

printf("name = %s, value = %s\n", \

json_object_iter_peek_name(&it), \

json_object_to_json_string(json_object_iter_peek_value(&it)));

json_object_iter_next(&it);

}

return 0;

}

# ./test1

name = first, value = "george"

name = age, value = 100

14. int json_c_set_serialization_double_format(const char *double_format, int global_or_thread)

        global_or_thread可以为JSON_C_OPTION_GLOBAL或JSON_C_OPTION_THREAD,double_format的格式为"%.x",例如"%.5f",表示截取小数点后5位。

15. struct json_object* json_object_from_file(const char *filename)

        读取给定文件的全部内容,然后使用 json_tokener_parse() 将其转换为json_object。

16. int json_object_to_file(const char *filename, struct json_object *obj)

        等效于:json_object_to_file_ext(filename, obj, JSON_C_TO_STRING_PLAIN)。

PS:json_object输出到文件可以有不同的格式,如下:

JSON_C_TO_STRING_PLAIN:没有空格和换行,所以内容都在一行,并且内容紧贴着。

JSON_C_TO_STRING_SPACED:内容以空格隔开,但是内容都在一行。

JSON_C_TO_STRING_PRETTY:有空格,有换行和缩进,比较美观。

三. 总结

        本文总结了libjson-c库的一些常用的函数的用法,介绍了创建int,bool,string,array,object对象,以及如何遍历一个json_object,最后总结了json_object输出到文件的格式。

参考阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: