【问题标题】:How to test for a Boolean being TRUE/FALSE in cJSON如何在 cJSON 中测试布尔值是否为 TRUE/FALSE
【发布时间】:2018-06-22 00:25:06
【问题描述】:

我正在用 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 */
 }`

这似乎成功了。再次感谢@David Collins!

【问题讨论】:

  • 即使你修复了 API,你的括号是错误的,你将字符串文字的地址与0(在这种情况下也称为NULL)进行比较,它应该评估为0,然后将0 传递给cJSON_IsTrue。大概,您想要类似:if (cJSON_IsTrue("isDaytime")==0) {,尽管我不确定它应该在哪里查找该字符串(我不知道 API,但我假设您需要传递一些结构表示解析的对象?)。
  • 好点,谢谢!问题在于对“cJSON_IsTrue()”的调用。我只是没有看到如何使用这个 API 检查布尔值。我将编辑代码块以反映您的评论。

标签: c cjson


【解决方案1】:

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

【讨论】:

  • 好的,我要试试这个。我不希望它会起作用。我已经使用数据文件中的 cJSON 成功解析了数十个元素。问题不在于编译 cJSON,而在于调用 cJSON_IsTrue()。但是,我会尝试并告诉你。
  • @TerryWendt:也许您使用的是旧版本的库。我已经测试了来自 Github 的最新版本(版本 1.7.7)并使用上面显示的 cJSON_IsTrue() 函数工作正常。
  • 好的,问题解决了。我只是在我的项目中包含了 cJSON.h 和 cJSON.c 文件。我不想在每次升级发行版时都必须安装的软件包列表中添加另一个软件包...在进行 make/make 安装后,我仍然必须手动复制 *.so 文件及其链接到我系统的正确目录。我会将您的答案标记为解决方案。这不是直接的解决方案,但它确实让我找到了解决问题的方法,所以......非常感谢柯林斯先生!
  • 为了将来参考,我结束这个问题的最佳方式是什么?我应该记录我为解决问题所采取的步骤吗?如果是这样,我应该在显示步骤的地方输入我自己的问题的答案吗?我不确定,因为我认为我的解决方案可能非常特定于 linux 发行版。我认为你应该为你的答案获得“分数”,但这更像是一个线索而不是一个解决方案——这对我来说已经足够好了。但它对寻找类似问题的人最有帮助吗?再次感谢。
  • @TerryWendt:感谢您的反馈。我自己对 SO 比较陌生 - 并不是 100% 最适合您记录您的解决方案。我想这将是你自己添加另一个答案(而不是更新你原来的问题——这可能会让读者感到困惑)。更有经验的 SO 用户可能会有不同的建议。
猜你喜欢
  • 2022-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多