首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cJSON键值解析

cJSON键值解析
EN

Stack Overflow用户
提问于 2019-11-13 14:05:20
回答 1查看 3.8K关注 0票数 1

我使用cJSON解析存储在testdata.json文件中的JSON,如下所示:

代码语言:javascript
复制
{
    "text": "HelloWorld!!",
    "parameters": [{
            "length": 10
        },
        {
            "width": 16
        },

        {
            "height": 16
        }
    ]
}

通过下面的操作,我可以访问text字段。

代码语言:javascript
复制
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文件包含的内容,可以有更多的参数,如volumearea等。我的想法是,我有一个包含所有这些参数的struct,我必须检查JSON中提供的参数是否存在,并相应地设置值。struct看起来像:

代码语言:javascript
复制
typedef struct {
   char *path;
   int length;
   int width;
   int height;
   int volume;
   int area;
   int angle;
   int size;
} JsonParameters;

我试着这样做:

代码语言:javascript
复制
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中的有效参数检查密钥

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-13 14:48:02

下面是一个示例程序,它从示例JSON中遍历parameters数组的所有元素,并输出数组中每个对象的字段名称:

代码语言:javascript
复制
#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)),以及数组中每个对象的元素,因为您不知道哪个字段在哪个对象中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58838914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档