本文介绍开源 C 语言库Melon的 JSON 解析器。
相信很多读者都听说过甚至使用过 cJSON 开源库。那么本文就拿 cJSON 与 Melon 的 JSON 组件进行对比。
下面我们就来一起看一看。
假设我们要构建如下 JSON:
{
"name": "Awesome 4K",
"resolutions": [
{
"width": 1280,
"height": 720
},
{
"width": 1920,
"height": 1080
},
{
"width": 3840,
"height": 2160
}
]
}
那么,我们先看一下cJSON的构建代码:
#include <stdio.h>
#include <cjson/cJSON.h>
//NOTE: Returns a heap allocated string, you are required to free it after use.
char *create_monitor_with_helpers(void)
{
const unsigned int resolution_numbers[3][2] = {
{1280, 720},
{1920, 1080},
{3840, 2160}
};
char *string = NULL;
cJSON *resolutions = NULL;
size_t index = 0;
cJSON *monitor = cJSON_CreateObject();
if (cJSON_AddStringToObject(monitor, "name", "Awesome 4K") == NULL)
{
goto end;
}
resolutions = cJSON_AddArrayToObject(monitor, "resolutions");
if (resolutions == NULL)
{
goto end;
}
for (index = 0; index < (sizeof(resolution_numbers) / (2 * sizeof(int))); ++index)
{
cJSON *resolution = cJSON_CreateObject();
if (cJSON_AddNumberToObject(resolution, "width", resolution_numbers[index][0]) == NULL)
{
goto end;
}
if (cJSON_AddNumberToObject(resolution, "height", resolution_numbers[index][1]) == NULL)
{
goto end;
}
cJSON_AddItemToArray(resolutions, resolution);
}
string = cJSON_Print(monitor);
if (string == NULL)
{
fprintf(stderr, "Failed to print monitor.\n");
}
end:
cJSON_Delete(monitor);
return string;
}
int main(void)
{
char *p;
p = create_monitor_with_helpers();
printf("%s\n", p);
return 0;
}
下面,我们一起看下使用Melon 的 JSON 组件的代码:
#include <stdio.h>
#include "mln_json.h"
#include "mln_log.h"
static mln_string_t *generate(void)
{
mln_json_t j;
mln_string_t *ret;
mln_json_init(&j);
mln_json_generate(&j, "{s:s,s:[{s:d,s:d},{s:d,s:d},{s:d,s:d}]}", \
"name", "Awesome 4K", "resolutions", "width", 1280, "height", 720, \
"width", 1920, "height", 1080, "width", 3840, "height", 2160);
ret = mln_json_encode(&j);
mln_json_destroy(&j);
return ret;
}
int main(void)
{
mln_string_t *p;
p = generate();
mln_log(none, "%S\n", p);
return 0;
}
假设我们有如下 JSON:
{
"name": "Awesome 4K",
"resolutions": [
{
"width": 1280,
"height": 720
}
]
}
下面一起来看下解码,还是先上cJSON的代码:
#include <stdio.h>
#include <cjson/cJSON.h>
/* return 1 if the monitor supports full hd, 0 otherwise */
int supports_full_hd(const char * const monitor)
{
const cJSON *resolution = NULL;
const cJSON *resolutions = NULL;
cJSON *monitor_json = cJSON_Parse(monitor);
if (monitor_json == NULL)
return -1;
resolutions = cJSON_GetObjectItemCaseSensitive(monitor_json, "resolutions");
cJSON_ArrayForEach(resolution, resolutions)
{
cJSON *width = cJSON_GetObjectItemCaseSensitive(resolution, "width");
return width->valuedouble;
}
cJSON_Delete(monitor_json);
return -1;
}
int main(void)
{
char p[] = "{\"name\":\"Awesome 4K\",\"resolutions\":[{\"width\":1280,\"height\":720}]}";
int i = supports_full_hd(p);
printf("%d\n", i);
return 0;
}
接下来是Melon 的 JSON 组件的解码代码:
#include <stdio.h>
#include "mln_json.h"
#include "mln_log.h"
static int handler(mln_json_t *j, void *data)
{
return (int)M_JSON_GET_DATA_NUMBER(j);
}
static int parse(mln_string_t *p)
{
mln_json_t j;
mln_string_t exp = mln_string("resolutions.0.width");
mln_json_decode(p, &j);
return mln_json_parse(&j, &exp, handler, NULL);
}
int main(void)
{
mln_string_t p = mln_string("{\"name\":\"Awesome 4K\",\"resolutions\":[{\"width\":1280,\"height\":720}]}");
int i = parse(&p);
mln_log(none, "%d\n", i);
return 0;
}
Melon 的 JSON 组件主要提供了如下四个函数来便于使用者构建和解析 JSON:
mln_json_decode
解码 JSON 字符串为 JSON 结构体结点mln_json_parse
从解码的 JSON 结构体中,根据给定表达式,获取对应的 JSON 子结点mln_json_generate
根据给定的格式信息构建 JSON 结构体mln_json_encode
根据生成的 JSON 结构体生成 JSON 字符串Melon 的 JSON 组件提供了易于阅读和使用的函数接口,更易于开发者对项目的维护。
欢迎大家来试用开源 C 语言库 Melon 。
1
yolee599 2023-09-12 09:10:27 +08:00 via Android
性能怎么样呢?其实我写 C 不喜欢用参数列表,看着逻辑不清晰
|
2
xi4oyu 2023-09-12 10:13:08 +08:00
可以看看这个,我觉得用起来更简单: https://github.com/gd-zth/ezJSON
|
3
FaiChou 2023-09-12 11:42:27 +08:00
赞呀,最近在学 C 语言,刚好要拿 cJSON 来研究,这下又加了一个学习案例。
|