我使用cJSON解析存储在testdata.json文件中的JSON,如下所示:
{
"text": "HelloWorld!!",
"parameters": [{
"length": 10
},
{
"width": 16
},
{
"height": 16
}
]
}通过下面的操作,我可以访问text字段。
int main(int argc, const char * argv[]) {
//open file and read into buffer
cJSON *root = cJSON_Parse(buffer);
char *text = cJSON_GetObjectItem(root, "text")->valuestring;
printf("text: %s\n", text);
}注意:这些参数是动态的,因为根据JSON文件包含的内容,可以有更多的参数,如volume、area等。我的想法是,我有一个包含所有这些参数的struct,我必须检查JSON中提供的参数是否存在,并相应地设置值。struct看起来像:
typedef struct {
char *path;
int length;
int width;
int height;
int volume;
int area;
int angle;
int size;
} JsonParameters;我试着这样做:
cJSON *parameters = cJSON_GetObjectItem(root, "parameters");
int parameters_count = cJSON_GetArraySize(parameters);
printf("Parameters:\n");
for (int i = 0; i < parameters_count; i++) {
cJSON *parameter = cJSON_GetArrayItem(parameters, i);
int length = cJSON_GetObjectItem(parameter, "length")->valueint;
int width = cJSON_GetObjectItem(parameter, "width")->valueint;
int height = cJSON_GetObjectItem(parameter, "height")->valueint;
printf("%d %d %d\n",length, width, height);
}这将返回Memory access error (memory dumped),再加上我必须说明键是什么。如前所述,我不知道参数是什么。
如何存储键值对("length":10、"width":16、"height":16等)以及如何根据JsonParameters中的有效参数检查密钥
发布于 2019-11-13 14:48:02
下面是一个示例程序,它从示例JSON中遍历parameters数组的所有元素,并输出数组中每个对象的字段名称:
#include <stdio.h>
#include <cJSON.h>
int main(void) {
const char *json_string = "{\"text\":\"HelloWorld!!\",\"parameters\":[{\"length\":10},{\"width\":16},{\"height\":16}]}";
cJSON *root = cJSON_Parse(json_string);
cJSON *parameters = cJSON_GetObjectItemCaseSensitive(root, "parameters");
puts("Parameters:");
cJSON *parameter;
cJSON_ArrayForEach(parameter, parameters) {
/* Each element is an object with unknown field(s) */
cJSON *elem;
cJSON_ArrayForEach(elem, parameter) {
printf("Found key '%s', set to %d\n", elem->string, elem->valueint);
}
}
cJSON_Delete(root);
return 0;
}您可以将每个字段名与您所关心的字段名列表进行比较(简单的方法是作为一堆if/else if's和strcmp()),为每个字段设置适当的结构字段。
这里重要的事情是使用cJSON_ArrayForEach宏遍历数组的两个元素(cJSON表示JSON数组为链接列表,并按索引获取每个元素,就像代码中的那样,使遍历数组成为O(N^2)操作,而这个宏是O(N)),以及数组中每个对象的元素,因为您不知道哪个字段在哪个对象中。
https://stackoverflow.com/questions/58838914
复制相似问题