1. 选择哪一款开源库
开源库有很多,也有相关博文介绍和对比,最后依然选择了jansson,只因https://code.google.com/p/libjson/source/checkout 编写该libjson库的原作者声明:This project is no longer being actively developed. I have instead started using libjansson.
2. 编译
下载代码:
git clone https://github.com/akheron/jansson
官方文档已经相当明确的说明了编译的过程:https://jansson.readthedocs.org/en/2.5/gettingstarted.html;
需要注意一点,在windows上生成vs2008工程时,示例代码无法编译通过,在jansson_private_config.h头文件中增加:
#ifndef HAVE_UINT16_T
# define uint16_t unsigned short
#endif
#ifndef HAVE_UINT8_T
# define uint8_t unsigned char
#endif
即可正常使用jansson
3. 示例代码
这里指阐述win下生成project后如何使用,linux下面后期再补上;
#include "jansson.h"
#include <assert.h>
int _tmain(int argc, _TCHAR* argv[])
{
const char *pJson = "[ \
{ \
\"object1-key1\": 123, \
\"object1-key2\": \"abc\" \
}, \
{ \
\"test\": \"x\", \
\"test2\": \"x2\" \
}, \
{ \
\"key\": \"y\" \
} \
]" ;
json_error_t error;
json_t *pRoot = json_loads(pJson, JSON_REJECT_DUPLICATES, &error);
if ( pRoot == NULL )
{
printf("%s", error.text);
return -1;
}
int value1 = 0;
const char *value2 = NULL;
const char *value3 = NULL;
const char *value4 = NULL;
const char *value5 = NULL;
///first solution to analyze quickly when u know keys.
int iRet = json_unpack(pRoot, "[{s:i,s:s},{s:s,s:s},{s:s}]", "object1-key1", &value1,
"object1-key2", &value2,
"test", &value3,
"test2",&value4,
"key", &value5);
assert( iRet == 0 );
json_decref(pRoot);
return 0;
}
应jansson提供了两个json_load*, json_unpack*, json_pack*这几个强大的接口,使得构建和解析json格式变得异常简单了~
4. 文档比较全面:https://jansson.readthedocs.org/en/2.5/apiref.html;
通过阅读该文档,就几乎没有问题了,而且源码可读性非常高,易于扩展和维护;