使用C解析JSON


82

我正在尝试寻找一种用C解析JSON的好方法。我真的不需要庞大的库或任何东西,我宁愿拥有体积小,重量轻,功能最少的东西,但有很好的文档。

有人有什么可以指点我的吗?


5
您是否正在使用Linux发行版?
尼克,


Objective-C库可以工作吗?我在obj-c中在Mac上使用TouchJson时,它非常易于使用且体积很小。
尼克,

当您说“最低限度”时,您实际可以达到最低限度吗?有些人会处理各种Unicode编码,有的只是UTF-8,有的只注重了ASCII码“格式字符”如{[]},",和反斜线。他们可能会或可能不会把Unicode转义序列交给您,他们可能会让您检查数字是否在允许的Unicode范围内,依此类推。然后,将任意JSON解析为树与将已知JSON解析为C之间有很大的不同结构。
hippietrail 2013年

Answers:


73

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

在Json.org上有大量的C库链接。也许其中之一会很适合您。


3
是的,谢谢您的回答!我经历了一堆,它们的记录/维护都非常差。我以为我会在整合一个受苦之前尝试在这里... :)
dshipper

2
@dshipper:鉴于您的要求,sourceforge.net / projects / cjson看起来很有希望。我个人没有使用过这些库中的任何一个,因此我不推荐使用。无论如何,对单个图书馆的建议只是一个意见,而不是一个明确的答案:)
Merlyn Morgan-Graham

5
@dshipper:我在jansson上有很好的经验,jansson轻巧且有据可查。 digip.org/jansson/doc/2.1
Dietrich Epp

1
@ Dietrich,dshipper:我刚才看着Jansson。我同意它有充分的文档证明,而且很小,而且看起来它具有很好的测试套件。它也可能符合您的要求。但是可能有几个可以使用的库。我建议您尽可能地抽象您的Json依赖项,尝试一些库,看看哪一个给您带来最少的痛苦:)
Merlyn Morgan-Graham

那么,@ dshipper,您是去sourceforge.net/projects/cjson还是什么?
Mawg说恢复Monica 2015年

37

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

编辑:多年来,我们对cJSON进行了一些改进


10

Jsmn非常简单,只有两个功能可以使用。

http://zserge.bitbucket.org/jsmn.html


jsmn的一个缺点是它不处理Unicode转义序列。在其来源中,您将看到:/* Allows escaped symbol \uXXXX */... case 'u':.../* TODO */
hippietrail 2013年

14
同样,它所做的就是为您提供令牌,祝您好运。它看起来确实像是您可以做的绝对最小,最有效的事情,但是它也没有做很多事情。
NateS

显然,他们已修复了Unicode符号的“ TODO”。
aviggiano

9

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或其他选项的比较方式?
马特2014年

5
简单的事情以简单的方式完成-这是NXJSON与大多数其他解析器的主要区别。cJSON也很简单,但是除了json解析器之外,它还包括json构造函数和序列化程序。cJSON复制所有字符串时需要更多的内存,而NXJSON进行所有操作就位以破坏原始内容。根据您的任务,这些差异可被视为优势或劣势。NXJSON还处理注释,这对于解析配置文件很有用。
Yaroslav Stavnichiy 2014年

9

你可以看看 詹森

该网站声明以下内容:Jansson是一个C库,用于编码,解码和处理JSON数据。它具有以下特点:

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

1
直接的Github链接:github.com/akheron/jansson
Ray

jsmn由于它的速度[1],我很想使用它,但是它不支持编码。此外,Jansson确实非常易于使用。--- [1] translate.google.it/…–
马可·苏拉

OjC快速并且支持编码。github.com/ohler55/ojc
Peter Ohler

Jansson是我去解析C语言中的JSON的
途径

8

我将JSON-C用于一个工作项目,并且会推荐它。轻巧,并通过开放许可发布。

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

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

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


6

您需要解析任意的JSON结构,还是仅解析特定于您的应用程序的数据。如果是后者,则无需生成将JSON键映射到值的任何哈希表/映射结构,就可以使其更加轻巧和高效。您可以直接将数据直接存储到struct字段中。


2
在将JSON与非动态语言(例如C)一起使用时,这是非常重要的一点。但这不是答案,因此,实际上应该是对OP问题的评论。
hippietrail 2013年

+1进行创造性思维!那将如何工作?难道这还不能利用特别轻量的库吗?解析到结构域中似乎仍然需要大量工作。
CL22 2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.