【发布时间】:2019-12-08 23:02:57
【问题描述】:
有这个字符串(str):
ip=127.0.0.1&server=localhost&uri=/&vers=0.56&total_processed=21&total_blocked=20&config=learning&cscore0=$XSS&score0=16&zone0=ARGS&id0=1302&var_name0=a&zone1=ARGS&id1=1303&var_name1=a
想用纯 C 语言生成 JSON,比如 key:value 即 ip: 127.0.0.1 等
试过这段代码:
struct key_value
{
char key[128];
char value[128];
};
int number_of_keys = 50;
struct key_value *kv = malloc(sizeof(struct key_value) * number_of_keys);
if (kv == NULL) {
perror("Malloc");
exit(EXIT_FAILURE);
}
char delim[] = "&";
char *ptr = strtok((char *)((ngx_str_t *)ostr->elts)[0].data, delim);
int j=0;
while(ptr != NULL)
{
sscanf(ptr,"%[^=]=%[^\n]",kv[j].key,kv[j].value);
ptr = strtok(NULL, delim);
j=j+1;
}
ngx_log_error(NGX_LOG_ERR, r->connection->log,
0, "{ %s:%s }", kv[0].key, kv[0].value);
但是忘记了如何使用未知元素计数创建一个函数来访问/格式化它???上面我只添加了 2 %s ...但它可以更多
上面的代码在速度和可靠性上有什么改进吗?
谢谢,
【问题讨论】:
-
你为什么要
strtok呢?就while(sscanf(...) == 2) -
是否需要在输出之前将结果存储在结构/数组中?
-
找到一个可以做到这一点的库?
-
用
sscanf()或类似的方式处理一般的JSON 将是一个令人沮丧的练习。获取 JSON 库——JSON 网站上列出了许多可供选择的库。 -
@dvhh — 哦,是的;也许Using
scanf()in a loop 更相关(尽管生成正确的 JSON 也并非完全简单,尽管它比解析 JSON 要简单得多)。