我正在读取和解析一个json文件;如果文件中没有新行,它就可以正常工作;这是代码:
#include <json-c/json.h>
#include <stdio.h>
#include <string.h>
void parse_json(json_object * jobj);
int main(int argc, char* argv[]) {
FILE *fp = fopen(argv[1], "r");
char tmp[65000] = { 0x0 };
if (fp == NULL) {
perror("Error opening file");
return (-1);
} else {
while (fp && fgets(tmp, sizeof(tmp), fp)) {
}
}
fclose(fp);
json_object * jobj = json_tokener_parse(tmp);
parse_json(jobj);
}
void parse_json(json_object * jobj) {
printf("n");
enum json_type type;
json_object_object_foreach(jobj, key, val)
{
type = json_object_get_type(val);
switch (type) {
case json_type_string:
if (strcmp(key, "product") == 0) {
printf("***** key found! ***** n");
printf("key: %s, value: %s n", key,
json_object_get_string(val));
printf("***** End keys ***** n");
} else {
printf("key: %s, value: %s n", key,
json_object_get_string(val));
}
break;
}
}
}
这是工作 json:
{"product": "Live JSON generator"}
这是崩溃的json。
{
"colors" :"blue"
}
所以我认为我的错误是阅读文件部分。我做错了什么?
在文件带有新行的情况下
while (fp && fgets(tmp, sizeof(tmp), fp))
{
}
tmp
将只有}
,因为fgets
会覆盖以前的值。因此,当您传递无效的json
标签时,json_tokener_parse
将返回NULL
。
您可以执行以下操作。
while (fp && fgets(tmp+strlen(tmp), sizeof(tmp)-strlen(tmp), fp))
或再有一个缓冲区,每次都附加tmp
。
注意:我不确定
json_tokener_parse
是否将带有n
char *
作为有效的json
标签。在这种情况下,您可能需要手动分析缓冲区中的n
。