使用C语言解析JSON

106

我正在尝试寻找一种在C语言中解析JSON的好方法。我真的不需要一个庞大的库或其他什么东西,我宁愿使用一些小型且轻量级的工具,拥有最基本的功能,但文档要良好。

是否有人可以向我指出什么呢?


6
你正在使用Linux发行版吗? - Nick
json-glib - Nick
当你说“最低限度”时,你实际上能够做到多么最小化?一些将处理各种Unicode编码,一些仅处理UTF-8,而有些则只关注ASCII“格式字符”,例如{[]},"和反斜杠。他们可能会或可能不会将Unicode转义序列的转换留给您,他们可能要由您检查数字是否在允许的Unicode范围内等。然后,在将任意JSON解析为树与已知JSON解析为C结构之间存在重大差异。 - hippietrail
让我不推荐两个看似合理的库:RapidJSONJSONXX都是完全无法使用的。RapidJSON不能直接编译,而JSONXX在简单测试中失败。 - Meekohi
显示剩余2条评论
7个回答

86

Json并不是一个庞大的语言,因此与之相关的库很可能比Xml库要小(至少如此)。

在Json.org上链接了许多C库。也许其中有一个适合你。


3
谢谢你的回答!我看了好几个,它们的文档/维护都很不好。在我费尽心思地整合之前,我想在这里试一试…… :) - dshipper
2
@dshipper:http://sourceforge.net/projects/cjson/ 看起来符合你的需求,值得期待。个人没有使用过这些库,所以无法推荐。就一个单一库的建议只是一种意见,不是最终答案 :) - Merlyn Morgan-Graham
5
我曾使用过jansson,它是一个轻量级的、文档详尽的工具,并且使用效果良好。http://www.digip.org/jansson/doc/2.1/ - Dietrich Epp
1
@Dietrich, dshipper:我刚刚看了一下Jansson。我同意它的文档很好,而且非常小,看起来测试套件也很不错。它可能也符合您的要求。但是可能有几个库可以使用。我建议您尽可能地抽象化您的Json依赖关系,尝试几个库,并查看哪个会给您带来最少的麻烦 :) - Merlyn Morgan-Graham
那么,@dshipper,你是选择了sourceforge.net/projects/cjson还是其他的呢? - Mawg says reinstate Monica
cJSON 我们使用得很好。 - hukeping

44

cJSON拥有良好的API并且很小(2个文件,~700行)。我最初看到的许多其他JSON解析器都非常庞大... 我只想解析一些JSON。

编辑:这些年来我们对cJSON进行了一些改进。


通过索引获取数组元素时速度较慢。 - Enes Altınkaya
1
@EnesAltınkaya 是的,因为项目被存储为链表。如果你的数据很大,JSON也不是正确的选择。 - NateS

12

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或其他选项相比如何? - Matt
6
NXJSON与大多数其他解析器最大的不同在于,它采用简单的方式处理简单的事情。cJSON也很简单,但除了json解析器,它还包括json构造器和序列化器。cJSON需要更多内存,因为它复制所有字符串,而NXJSON在原地进行所有操作,破坏原始内容。根据您的任务,这些差异可能被视为优点或缺点。NXJSON还处理注释,这对于解析配置文件非常有用。 - Yaroslav Stavnichiy

11
你可以查看 Jansson 该网站介绍了以下内容: Jansson 是一个C语言库,用于编码、解码和操作JSON数据。它具有以下特点:
  • 简单直观的API和数据模型
  • 可同时对JSON进行编码和解码
  • 详尽的文档
  • 不依赖其他库
  • 完全支持Unicode (UTF-8)
  • 广泛的测试套件

1
直接Github链接:https://github.com/akheron/jansson - Ray Hulha
我曾经因为它的速度而想使用 jsmn,但它不支持编码。此外,Jansson 真的很容易使用。 - Marco Sulla
OjC 是快速的,并支持编码。https://github.com/ohler55/ojc - Peter Ohler
Jansson 是我在 C 语言中解析 JSON 的首选。 - Kenneth Wilke

11

jsmn 的一个缺点是它不能处理 Unicode 转义序列。在其源代码中,您会看到:/* 允许转义符号 \uXXXX */ ... case 'u': ... /* 待办事项 */ - hippietrail
15
它只是提供代币,很难理解数据。它看起来是最小、高效的选择,但并不能做很多事情。 - NateS
1
显然,他们已经修复了Unicode符号的“TODO”。 - aviggiano

9

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

文档包含在发行版中。您可以使用*_add函数创建JSON对象,使用等效的*_put函数释放它们的内存,并使用实用程序函数将类型转换并以字符串表示输出对象。

许可证允许将其包含在您的项目中。我们将其编译为静态库,并将其链接到主要构建中。这样,我们就不必担心依赖关系(除了安装Xcode之外)。

JSON-C还在OS X(x86 Intel)和Linux(x86 Intel)下成功构建。如果您的项目需要可移植性,这是一个很好的起点。


9

您需要解析任意的JSON结构,还是仅处理与您的应用程序相关的数据?如果是后者,您可以通过不生成映射JSON键值对的哈希表/映射结构,直接将数据存储到结构字段或其他位置,使它变得更加轻量高效。


3
在使用 JSON 和像 C 这样的非动态语言时,这是一个非常重要的问题。但它并不是答案,因此应该是对 OP 问题的评论。 - hippietrail
+1 鼓励创造性思维!不过这该怎么实现呢?难道还不能使用一个特别轻量级的库吗?将解析结果转换为结构字段仍然需要相当多的工作。 - Jodes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接