libjson-c使用介绍
一. 前言
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 <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <json-c/json_object.h>
#include <json-c/json_tokener.h>
#include <json-c/json_object_iterator.h>
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输出到文件的格式。