我正在读取和解析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"
}
所以我认为我的错误是因为读取文件部分.. 我在做什么错了?
答案 0 :(得分:0)
如果文件中有新行
while (fp && fgets(tmp, sizeof(tmp), fp))
{
}
tmp
仅具有}
,因为fgets
会覆盖先前的值。
因此,json_tokener_parse
将在您传递无效的NULL
标记时返回json
。
您可以执行以下操作。
while (fp && fgets(tmp+strlen(tmp), sizeof(tmp)-strlen(tmp), fp))
或
再有一个缓冲区,每次都将tmp
附加到缓冲区中。
注意:我不确定
json_tokener_parse
是否将char *
的{{1}}用作有效的\n
标签。在这种情况下,您可能需要手动从缓冲区中解析出json
。