是否有关于如何使用基于 C 的 YAJL 库解析简单 JSON 文件的简单示例?
Posted
技术标签:
【中文标题】是否有关于如何使用基于 C 的 YAJL 库解析简单 JSON 文件的简单示例?【英文标题】:Are there simple examples of how to parse a simple JSON file using the C-based YAJL library? 【发布时间】:2011-08-13 14:17:52 【问题描述】:我知道 YAJL 周围有一个 Objective-C 包装器,但这是一个非常胖的东西,它把整个 JASON 解析器炸成了一个荒谬的 21 个文件,其中许多文件很小滚动条。
所以为了让我的应用程序二进制小,我想坚持使用该解析器的 C 版本。但是我很难找到任何有用的文档而不是包装器。
也许使用过 C-base 的人可以指出这样的教程或文档?
【问题讨论】:
【参考方案1】:可以在此处找到包含 C 示例的文档:http://lloyd.github.com/yajl/ 可以在此处找到带有示例的 github 存储库:https://github.com/lloyd/yajl 这是一个从标准输入重新格式化 JSON 的 C 示例:
#include <yajl/yajl_parse.h>
#include <yajl/yajl_gen.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static int reformat_null(void * ctx)
yajl_gen g = (yajl_gen) ctx;
return yajl_gen_status_ok == yajl_gen_null(g);
static int reformat_boolean(void * ctx, int boolean)
yajl_gen g = (yajl_gen) ctx;
return yajl_gen_status_ok == yajl_gen_bool(g, boolean);
static int reformat_number(void * ctx, const char * s, size_t l)
yajl_gen g = (yajl_gen) ctx;
return yajl_gen_status_ok == yajl_gen_number(g, s, l);
static int reformat_string(void * ctx, const unsigned char * stringVal,
size_t stringLen)
yajl_gen g = (yajl_gen) ctx;
return yajl_gen_status_ok == yajl_gen_string(g, stringVal, stringLen);
static int reformat_map_key(void * ctx, const unsigned char * stringVal,
size_t stringLen)
yajl_gen g = (yajl_gen) ctx;
return yajl_gen_status_ok == yajl_gen_string(g, stringVal, stringLen);
static int reformat_start_map(void * ctx)
yajl_gen g = (yajl_gen) ctx;
return yajl_gen_status_ok == yajl_gen_map_open(g);
static int reformat_end_map(void * ctx)
yajl_gen g = (yajl_gen) ctx;
return yajl_gen_status_ok == yajl_gen_map_close(g);
static int reformat_start_array(void * ctx)
yajl_gen g = (yajl_gen) ctx;
return yajl_gen_status_ok == yajl_gen_array_open(g);
static int reformat_end_array(void * ctx)
yajl_gen g = (yajl_gen) ctx;
return yajl_gen_status_ok == yajl_gen_array_close(g);
static yajl_callbacks callbacks =
reformat_null,
reformat_boolean,
NULL,
NULL,
reformat_number,
reformat_string,
reformat_start_map,
reformat_map_key,
reformat_end_map,
reformat_start_array,
reformat_end_array
;
static void
usage(const char * progname)
fprintf(stderr, "%s: reformat json from stdin\n"
"usage: json_reformat [options]\n"
" -m minimize json rather than beautify (default)\n"
" -u allow invalid UTF8 inside strings during parsing\n",
progname);
exit(1);
int
main(int argc, char ** argv)
yajl_handle hand;
static unsigned char fileData[65536];
/* generator config */
yajl_gen g;
yajl_status stat;
size_t rd;
int retval = 0;
int a = 1;
g = yajl_gen_alloc(NULL);
yajl_gen_config(g, yajl_gen_beautify, 1);
yajl_gen_config(g, yajl_gen_validate_utf8, 1);
/* ok. open file. let's read and parse */
hand = yajl_alloc(&callbacks, NULL, (void *) g);
/* and let's allow comments by default */
yajl_config(hand, yajl_allow_comments, 1);
/* check arguments.*/
while ((a < argc) && (argv[a][0] == '-') && (strlen(argv[a]) > 1))
unsigned int i;
for ( i=1; i < strlen(argv[a]); i++)
switch (argv[a][i])
case 'm':
yajl_gen_config(g, yajl_gen_beautify, 0);
break;
case 'u':
yajl_config(hand, yajl_dont_validate_strings, 1);
break;
default:
fprintf(stderr, "unrecognized option: '%c'\n\n",
argv[a][i]);
usage(argv[0]);
++a;
if (a < argc)
usage(argv[0]);
for (;;)
rd = fread((void *) fileData, 1, sizeof(fileData) - 1, stdin);
if (rd == 0)
if (!feof(stdin))
fprintf(stderr, "error on file read.\n");
retval = 1;
break;
fileData[rd] = 0;
stat = yajl_parse(hand, fileData, rd);
if (stat != yajl_status_ok) break;
const unsigned char * buf;
size_t len;
yajl_gen_get_buf(g, &buf, &len);
fwrite(buf, 1, len, stdout);
yajl_gen_clear(g);
stat = yajl_complete_parse(hand);
if (stat != yajl_status_ok)
unsigned char * str = yajl_get_error(hand, 1, fileData, rd);
fprintf(stderr, "%s", (const char *) str);
yajl_free_error(hand, str);
retval = 1;
yajl_gen_free(g);
yajl_free(hand);
return retval;
【讨论】:
以上是关于是否有关于如何使用基于 C 的 YAJL 库解析简单 JSON 文件的简单示例?的主要内容,如果未能解决你的问题,请参考以下文章