如何在cJSON

时间:2018-06-22 00:25:07

标签: c cjson

我正在使用cJSON解析json文件。一切都很顺利。但是数据元素之一是布尔值,问题是我不明白如何使用cJSON的函数读取布尔值类型。数据文件包含以下行:

"isDaytime": true,

我尝试使用类似以下的代码块:

if (cJSON_IsTrue("isDaytime")==0) {
    printf("isDaytime = TRUE\n");
} else {
    printf("isDaytime = FALSE\n");
}

当我尝试使用gcc进行编译时,收到以下消息:

undefined reference to `cJSON_IsTrue'

我认为也许cJSON将其表示为int?我不知道。无论如何,有人知道我应该如何调用cJSON_IsTrue()吗?也许我根本不应该调用cJSON_IsTrue()。如果没有,我应该如何检查这种类型的数据元素?如果它是一个整数,我一定会做的。如果它是一个字符*,我就完成了。我只是不确定应该如何测试它是对还是错。

编辑: 根据cJSON库的文档,在这里:https://github.com/DaveGamble/cJSON

因为整个库只有一个C文件和一个头文件,所以您只需将cJSON.h和cJSON.c复制到项目源并开始使用它。

这就是我使用cJSON的方式。我刚刚将两个文件包含在我的项目中,并且一切工作都非常顺畅。直到我尝试使用cJSON_IsTrue()函数。我从文档或源文件中看不到如何正确使用该功能。我以为我会尝试“错误地”使用它,然后通过出现的任何错误消息来纠正自己。

我没想到会收到“ undefined reference”错误消息。我查看了源代码,确实功能在那里...

David Collins建议我在编译时需要链接到cjson库。我包括了源,所以我认为这并不是真正的答案。但是,好吧。因此,我按照指示进行操作,并实际上在系统上安装了该库。而且我得到了相同的未定义参考错误消息。

原来,没有引用该库自身的安装位置:/ usr / local / lib。我将安装的文件复制到系统的正确目录中,并且在使用-lcjson标志进行编译时,现在可以使用cJSON_IsTrue()函数。

那么如何使用它呢?这是我的用法:

`if ( cJSON_IsTrue(cJSON_GetObjectItem(subitem, "isDayTime")) == 1) {
    /* do something if it's true */
 } else {
    /* do something if it's false */
 }`

这似乎可以解决问题。再次感谢@David Collins!

1 个答案:

答案 0 :(得分:2)

cJSON_IsTrue()不需要字符串文字;它需要一个cJSON对象。

假定json_string完整JSON对象char *表示。然后,您可以尝试以下操作。

首先解析顶级JSON对象。

cJSON *json = CJSON_Parse(json_string);
if (json == NULL) {
    // Handle error and abort if appropriate
}

然后提取您的子对象。

cJSON *daytime_json = cJSON_GetObjectItemCaseSensitive(json, "isDayTime");
if (cJSON_IsTrue(daytime_json) == 0) {
    // Whatever you need to do next ...
}
// Etc.

最后,不要忘记取消分配内存/之后再清理。

cJSON_Delete(json);

编译/链接

您提到了

  

当我尝试使用gcc进行编译时,收到以下消息:
      未定义对cJSON_IsTrue

的引用

编译时需要链接cjson库。例如,如果使用gcc编译器,则应使用类似

gcc -o json-test json-test.c -lcjson