当我尝试从我的 json 文件中获取 val 的结果时,我遇到了一个段错误,如果我注释掉这些行,其他提取值返回正常
/*parseText(obj, "val", &tmp);
strcpy (test.val, tmp);
printf("val = %s\n", test.val); */
这是唯一一个不是我认为我处理不正确的整数的整数。
这是我的代码,json文件在下面。
#include "stdio.h"
#include "string.h"
#include "json-c/json.h"
typedef struct __attribute__ ((packed))
{
char val[4];
uint32_t fetch_1;
uint32_t fetch_2;
uint32_t fetch_3;
uint32_t fetch_4;
uint32_t fetch_5;
}
TEST;
static int parseText(struct json_object *new_obj, const char *field,
void *val)
{
struct json_object *o = NULL;
json_type type;
int ret = 0;
if (!json_object_object_get_ex(new_obj, field, &o))
printf("Field %s does not exist\n", field);
type = json_object_get_type(o);
switch (type) {
case json_type_null:
printf("Return type is NULL\n");
ret = -1;
break;
case json_type_boolean:
*((int *)(val)) = json_object_get_boolean(o);
break;
case json_type_double:
*((double *)(val)) = json_object_get_double(o);
break;
case json_type_int:
*((int *)(val)) = json_object_get_int(o);
break;
case json_type_string:
val = (char *)json_object_get_string(o);
break;
case json_type_object:
case json_type_array:
ret = -1;;
break;
}
return ret;
}
static inline int parsing(struct json_object *obj) {
char* tmp = NULL;
TEST test;
memset(&test, 0, sizeof(test));
parseText(obj, "val", &tmp);
strcpy (test.val, tmp);
printf("val = %s\n", test.val);
parseText(obj, "fetch 1", &test.fetch_1);
printf("fetch_1= %d\n", test.fetch_1);
parseText(obj, "fetch 2", &test.fetch_2);
printf("fetch_2= %d\n", test.fetch_2);
parseText(obj, "fetch 3", &test.fetch_3);
printf("fetch_3= %d\n", test.fetch_3);
parseText(obj, "fetch 4", &test.fetch_4);
printf("fetch_4= %d\n", test.fetch_4);
parseText(obj, "fetch 5", &test.fetch_5);
printf("fetch_5= %d\n", test.fetch_5);
return 0;
}
char* file_read (const char* filename) {
FILE* fp;
char* buffer;
long fsize;
/* Open the file */
fp = fopen (filename, "r");
if (fp == NULL)
{
return NULL;
}
/* Get the size of the file */
fseek (fp, 0, SEEK_END);
fsize = ftell (fp) + 1;
fseek (fp, 0, SEEK_SET);
/* Allocate the buffer */
buffer = calloc (fsize, sizeof (char));
if (buffer == NULL)
{
fclose (fp);
return NULL;
}
/* Read the file */
fread (buffer, sizeof (char), fsize, fp);
/* Close the file */
fclose (fp);
/* Return the buffer */
return buffer;
}
int main (int argc, char *argv[])
{
struct json_object *jsonObj;
int i = 0;
char* file = file_read(argv[1]);
jsonObj = json_tokener_parse(file);
for(i = 0; i < json_object_array_length(jsonObj); i++) {
json_object *obj = json_object_array_get_idx(jsonObj, i);
parsing(obj);
}
return 0;
}
这是json文件:
[{
"val": "fpr",
"fetch 1": 100,
"fetch 2": 200,
"fetch 3": 300,
"fetch 4": 400,
"fetch 5": 500
}, {
"val": "mpr",
"fetch 1": 445,
"fetch 2": 223,
"fetch 3": 1089,
"fetch 4": 432,
"fetch 5": 34400
}]