json解析库-jansson 使用

json解析C库很多,比较常用的一个就是cjson,但是cjson读取文件的时候,出错的时候,不能确定到底在哪一行,我觉得这是 jansson库一个做的不错的地方。

源码下载

作者 github 仓库:
https://github.com/akheron/jansson
我的 github 仓库,代码没动,只是加了我的个人注释,想学习源码的同学可以通过的github链接下载源码。
https://github.com/jxdeng3264/jansson

编译

linux 下编译比较简单,编译三部曲
./configure -> make -> make install
为了写博客、截图处理方便,主要示例 windows 下的使用。
jansson 提供了丰富的例子,方便学习,所以建议先看懂使用例子,然后进行源码阅读。

windows 下的例子,需要先编译。编译所需环境

a. cmake

b. vistual studio,我的 vs 版本为 vs2013,但是编译器版本是12,

1.如果是下载的 zip 文件,先解压代码,进入代码目录 jansson 目录
2. md build
3. cd build

cmake -G “Visual Studio 12” …
上面最后是两个点,表示上层目录,不知道为啥Markdown 两个点最后显示三个点,如果你知道怎么弄,可以告诉我
编译成功之后,在 build 目录下会生成所有的测试工程。
build 目录下的lib文件夹下有个 Debug 目录下有静态库 jansson_d.lib
两个头文件目录 private_include 和 include
build
 + lib
   + Debug/jansson_d.lib
 + private_include
 + include

运行测试程序

双击 jansson.sln , 可以看到很多小的测试代码。
将 test_array 设为启动项目,然后编译、运行,可以看到什么都没输出,通过代码可以知道,不出错时,是没有输出的。

如何直接使用jansson源码到自己项目?

如果不使用静态库,直接使用源码,可以把编译后build目录下的几个头文件靠到源码中 src目录下,覆盖原来的代码。然后使用的时候,直接 #include “jansson.h” 就可以了。


下面给出几个常用的函数操作:

扫描二维码关注公众号,回复: 10048261 查看本文章
char *text = "{"key":1,"key2":2}";
json_t *root;
json_error_t error;
root = json_loads(text, 0, &error);
void print_json_aux(json_t *element, int indent) {
	switch (json_typeof(element)) {
	case JSON_OBJECT:
		print_json_object(element, indent);
		break;
	case JSON_ARRAY:
		print_json_array(element, indent);
		break;
	case JSON_STRING:
		print_json_string(element, indent);
		break;
	case JSON_INTEGER:
		print_json_integer(element, indent);
		break;
	case JSON_REAL:
		print_json_real(element, indent);
		break;
	case JSON_TRUE:
		print_json_true(element, indent);
		break;
	case JSON_FALSE:
		print_json_false(element, indent);
		break;
	case JSON_NULL:
		print_json_null(element, indent);
		break;
	default:
		fprintf(stderr, "unrecognized JSON type %d\n", json_typeof(element));
	}
}
void print_json_true(json_t *element, int indent) {
	(void)element;
	print_json_indent(indent);
	printf("JSON True\n");
}

接下来看下 print_json_object 函数的实现,这样我们可以看到一个 json格式的字符串怎么遍历到所有键值。

void print_json_object(json_t *element, int indent) {
	size_t size;
	const char *key;
	json_t *value;

	print_json_indent(indent);
	size = json_object_size(element);

	printf("JSON Object of %ld pair%s:\n", size, json_plural(size));
	json_object_foreach(element, key, value) {
		print_json_indent(indent + 2);
		printf("JSON Key: \"%s\"\n", key);
		print_json_aux(value, indent + 2);
	}
}

下一篇将详细介绍介绍 json_object_foreach
下一篇文章,《jasson 源码阅读》,欢迎关注。
不理解或者编译有问题的朋友可以评论留言!

发布了37 篇原创文章 · 获赞 14 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/xiaod_szu/article/details/104232774