如何在 cJSON 中测试布尔值 TRUE/FALSE
How to test for a Boolean being TRUE/FALSE in 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() 。如果不是,我应该如何检查这种类型的数据元素?如果它是一个整数,我就完成了。如果它是一个 char *,我就完成了。我只是不确定我应该如何测试它是真还是假。
编辑:
根据 cJSON 库的文档,此处:https://github.com/DaveGamble/cJSON
Because the entire library is only one C file and one header file, you can just copy cJSON.h and cJSON.c to your projects source and start using it.
这就是我使用 cJSON 的方式。我刚刚将这两个文件包含在我的项目中,一切都运行良好。直到我尝试使用 cJSON_IsTrue() 函数。我无法从文档或源文件中看到如何正确使用该功能。我想我会尝试使用它,"wrongly",然后通过出现的任何错误消息纠正自己。
我没想到会收到 "undefined reference" 错误信息。看了下源码,确实有这个功能...
David Collins 建议我在编译时需要 link 到 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!
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);
编译/链接
你提到过
When I try to compile this with gcc, I get the following message:
undefined reference to cJSON_IsTrue
编译时需要link cjson
库。例如,如果使用 gcc
编译器,您将使用类似
的东西
gcc -o json-test json-test.c -lcjson
我正在用 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() 。如果不是,我应该如何检查这种类型的数据元素?如果它是一个整数,我就完成了。如果它是一个 char *,我就完成了。我只是不确定我应该如何测试它是真还是假。
编辑: 根据 cJSON 库的文档,此处:https://github.com/DaveGamble/cJSON
Because the entire library is only one C file and one header file, you can just copy cJSON.h and cJSON.c to your projects source and start using it.
这就是我使用 cJSON 的方式。我刚刚将这两个文件包含在我的项目中,一切都运行良好。直到我尝试使用 cJSON_IsTrue() 函数。我无法从文档或源文件中看到如何正确使用该功能。我想我会尝试使用它,"wrongly",然后通过出现的任何错误消息纠正自己。
我没想到会收到 "undefined reference" 错误信息。看了下源码,确实有这个功能...
David Collins 建议我在编译时需要 link 到 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!
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);
编译/链接
你提到过
When I try to compile this with gcc, I get the following message:
undefined reference tocJSON_IsTrue
编译时需要link cjson
库。例如,如果使用 gcc
编译器,您将使用类似
gcc -o json-test json-test.c -lcjson