STM32 Jansson解析json

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

通过阅读该文档,就几乎没有问题了,而且源码可读性非常高,易于扩展和维护;

Examples:

/* root is the JSON integer 42 */
int myint;
json_unpack(root, "i", &myint);
assert(myint == 42);

/* root is the JSON object {"foo": "bar", "quux": true} */
const char *str;
int boolean;
json_unpack(root, "{s:s, s:b}", "foo", &str, "quux", &boolean);
assert(strcmp(str, "bar") == 0 && boolean == 1);

/* root is the JSON array [[1, 2], {"baz": null} */
json_error_t error;
json_unpack_ex(root, &error, JSON_VALIDATE_ONLY, "[[i,i], {s:n}]", "baz");
/* returns 0 for validation success, nothing is extracted */

/* root is the JSON array [1, 2, 3, 4, 5] */
int myint1, myint2;
json_unpack(root, "[ii!]", &myint1, &myint2);
/* returns -1 for failed validation */

/* root is an empty JSON object */
int myint = 0, myint2 = 0, myint3 = 0;
json_unpack(root, "{s?i, s?[ii]}",
            "foo", &myint1,
            "bar", &myint2, &myint3);
/* myint1, myint2 or myint3 is no touched as "foo" and "bar" don't exist */



/* Build an empty JSON object */
json_pack("{}");

/* Build the JSON object {"foo": 42, "bar": 7} */
json_pack("{sisi}", "foo", 42, "bar", 7);

/* Like above, ':', ',' and whitespace are ignored */
json_pack("{s:i, s:i}", "foo", 42, "bar", 7);

/* Build the JSON array [[1, 2], {"cool": true}] */
json_pack("[[i,i],{s:b}]", 1, 2, "cool", 1);

/* Build a string from a non-null terminated buffer */
char buffer[4] = {'t', 'e', 's', 't'};
json_pack("s#", buffer, 4);

/* Concatenate strings together to build the JSON string "foobarbaz" */
json_pack("s++", "foo", "bar", "baz");

/* Create an empty object or array when optional members are missing */
json_pack("{s:s*,s:o*,s:O*}", "foo", NULL, "bar", NULL, "baz", NULL);
json_pack("[s*,o*,O*]", NULL, NULL, NULL);
posted @ 2019-05-31 10:16  苍月代表我  阅读(4742)  评论(0编辑  收藏  举报