0

我正在用 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() 。如果没有,我应该如何检查这种类型的数据元素?如果它是一个int,我就完成了。如果是 char *,我就完了。我只是不确定我应该如何测试它是真是假。

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

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

这就是我使用 cJSON 的方式。我刚刚将这两个文件包含在我的项目中,一切都像魅力一样工作。直到我尝试使用 cJSON_IsTrue() 函数。我无法从文档或源文件中看到如何正确使用该功能。我想我只是尝试“错误地”使用它,然后通过出现的任何错误消息来纠正自己。

我没想到会收到“未定义的引用”错误消息。我查看了源代码,确实该功能在那里......

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 */
 }`

这似乎成功了。再次感谢@大卫柯林斯!

4

1 回答 1

3

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

假设json_stringchar *您的完整 JSON 对象的表示。那你可以试试下面的。

首先解析顶级 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 编译它时,我收到以下消息:
undefined reference tocJSON_IsTrue

cjson编译时需要链接库。例如,如果使用gcc编译器,你会使用类似的东西

gcc -o json-test json-test.c -lcjson
于 2018-06-22T01:29:41.897 回答