【问题标题】:Parsing JSON using C [closed]使用 C 解析 JSON [关闭]
【发布时间】:2011-07-13 04:03:08
【问题描述】:

我正在尝试找到一种在 C 中解析 JSON 的好方法。我真的不需要一个庞大的库或任何东西,我宁愿拥有一些小而轻量级的东西,具有最少的功能,但有良好的文档。

有人可以指点我吗?

【问题讨论】:

  • 你使用的是 linux 发行版吗?
  • objective-c 库可以工作吗?我在我的 Mac 上使用 TouchJson 在 obj-c 中它非常易于使用且体积小。
  • 当您说“最低限度”时,您实际上能做到多少最低限度?有些会处理各种 Unicode 编码,有些只是 UTF-8,有些只关注 ASCII “格式字符”,例如 {[]}," , 和反斜杠。他们可能会或可能不会将 Unicode 转义序列由您决定,他们可能会让您检查数字是否在允许的 Unicode 范围内,等等。然后将任意 JSON 解析为树与将已知 JSON 解析为 C 之间存在主要区别结构。

标签: c json


【解决方案1】:

Json 并不是一门庞大的语言,因此它的库可能很小(至少比 Xml 库要小)。

有一大堆C libraries linked at Json.org。也许其中一种对你很有效。

【讨论】:

  • 是的,感谢您的回答!我经历了一堆,他们的记录/维护很差。我想我会在这里尝试,然后再集成一个.... :)
  • @dshipper: sourceforge.net/projects/cjson 看起来很有希望,考虑到您的要求。个人没有使用过这些库中的任何一个,所以我不能推荐一个。无论如何,对单个库的建议只是一种意见,而不是明确的答案:)
  • @dshipper:我对 jansson 有过很好的体验,它是轻量级的并且有据可查。 digip.org/jansson/doc/2.1
  • @Dietrich, dshipper:我刚才看了 Jansson。我同意它有据可查而且很小,而且看起来它有一个很好的测试套件。它可能也符合您的要求。但是可能有几个库可以工作。我建议您尽可能抽象您的 Json 依赖项,尝试一些库,看看哪个给您带来的痛苦最小 :)
  • 那么,@dshipper,你是去 sourceforge.net/projects/cjson 还是什么?
【解决方案2】:

cJSON 有一个不错的 API,而且很小(2 个文件,约 700 行)。我最初看到的许多其他 JSON 解析器都很庞大……我只想解析一些 JSON。

编辑:多年来,我们已经将some improvements 转换为 cJSON。

【讨论】:

    【解决方案3】:

    NXJSON 是功能齐全但非常小(约 400 行代码)的 JSON 解析器,具有易于使用的 API:

    const nx_json* json=nx_json_parse_utf8(code);
    printf("hello=%s\n", nx_json_get(json, "hello")->text_value);
    const nx_json* arr=nx_json_get(json, "my-array");
    int i;
    for (i=0; i<arr->length; i++) {
      const nx_json* item=nx_json_item(arr, i);
      printf("arr[%d]=(%d) %ld\n", i, (int)item->type, item->int_value);
    }
    nx_json_free(json);
    

    【讨论】:

    • 您似乎是 NXJSON 的开发者,也许您可​​以评论一下它与 cJSON 或其他选项的比较?
    • 简单的事情以简单的方式完成 - 这是 NXJSON 与大多数其他解析器的主要区别。 cJSON 也很简单,但除了 json 解析器之外,它还包括 json 构造函数和序列化器。 cJSON 需要更多内存,因为它会复制所有字符串,而 NXJSON 会在原地执行所有操作,破坏原始内容。根据您的任务,这些差异可以被视为优点或缺点。 NXJSON 还处理 cmets,这对于解析配置文件很有用。
    【解决方案4】:

    Jsmn 非常简约,只有两个函数可以使用。

    https://github.com/zserge/jsmn

    【讨论】:

    • jsmn 的一个缺点是它不处理 Unicode 转义序列。在其源代码中,您将看到:/* Allows escaped symbol \uXXXX */ ... case 'u': ... /* TODO */
    • 它所做的只是给你令牌,祝你好运,让你理解数据。它看起来确实是你能做的绝对最小、最高效的事情,但它也做不了很多。
    • 显然他们已经修复了 Unicode 符号的“TODO”。
    【解决方案5】:

    你可以看看Jansson

    该网站声明如下: Jansson 是一个用于编码、解码和操作 JSON 数据的 C 库。它的特点:

    • 简单直观的 API 和数据模型
    • 既可以编码为 JSON 也可以从 JSON 解码
    • 综合文档
    • 不依赖其他库
    • 完整的 Unicode 支持 (UTF-8)
    • 广泛的测试套件

    【讨论】:

    【解决方案6】:

    我在工作项目中使用了JSON-C,我会推荐它。轻量级,并通过开放许可发布。

    文档包含在分发中。您基本上有 *_add 函数来创建 JSON 对象,等效的 *_put 函数来释放它们的内存,以及以字符串表示形式转换类型和输出对象的实用函数。

    许可允许包含在您的项目中。我们以这种方式使用它,将 JSON-C 编译为与主构建链接的静态库。这样,我们就不必担心依赖关系(除了安装 Xcode)。

    JSON-C 也为我们在 OS X (x86 Intel) 和 Linux (x86 Intel) 下构建,没有任何意外。如果您的项目需要可移植,这是一个好的开始。

    【讨论】:

      【解决方案7】:

      您需要解析任意 JSON 结构,还是只解析特定于您的应用程序的数据。如果是后者,您可以通过不必生成任何将 JSON 键映射到值的哈希表/映射结构来使其更轻、更高效;您可以直接将数据存储到结构字段或其他任何内容中。

      【讨论】:

      • 在将 JSON 与 C 等非动态语言一起使用时,这一点非常重要。但这不是答案,因此应该对 OP 的问题发表评论。
      • 创意思维+1!那将如何工作?难道这还不能使用一个特别轻量级的库吗?解析成结构字段听起来仍然是一项相当大的工作。
      猜你喜欢
      • 1970-01-01
      • 2020-09-27
      • 1970-01-01
      • 2020-09-20
      • 2018-07-11
      • 1970-01-01
      • 2013-12-13
      • 1970-01-01
      • 2020-06-04
      相关资源
      最近更新 更多