使用C解析JSON

dsh*_*per 73 c json

我正在尝试找到一种在C中解析JSON的好方法.我真的不需要一个庞大的库或任何东西,我宁愿拥有一些小巧轻便的东西,只需要很少的功能,但是文档很好.

有没有人能指点我的东西?

Mer*_*ham 65

Json起初并不是一个庞大的语言,因此它的库可能很小(至少比Xml库还要小).

在Json.org上链接了大量的C库.也许其中一个会很适合你.

  • @dshipper:我和jansson有过很好的经历,jansson很轻巧且记录良好.http://www.digip.org/jansson/doc/2.1/ (5认同)
  • 是的,谢谢你的回答!我经历了一堆他们,他们的记录/维护很差.我以为我会在尝试整合之前尝试一下.... :) (3认同)
  • @dshipper:http://sourceforge.net/projects/cjson/看起来有点前途,满足您的要求.个人没有使用过这些库,所以我不推荐一个.对于单个库的建议只是一个意见,无论如何,而不是一个明确的答案:) (2认同)

Nat*_*teS 33

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

编辑:多年来我们对cJSON 做了一些改进.


小智 10

Jsmn非常简约,只有两个功能可供使用.

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

  • 它所做的一切都是给你令牌,祝你好运,对数据有所了解.它确实看起来像你可以做的绝对最小,最有效的事情,但它也没有做太多. (14认同)

Yar*_*hiy 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);
Run Code Online (Sandbox Code Playgroud)

  • 简单的事情做得很简单 - 这是NXJSON与大多数其他解析器的主要区别.cJSON也很简单,但除了json解析器之外,它还包括json构造函数和序列化程序.cJSON需要更多的内存,因为它复制了所有字符串,而NXJSON完成了所有操作,破坏了原始内容.根据您的任务,这些差异可以被视为优点或缺点.NXJSON还处理注释,这对于解析配置文件很有用. (5认同)

小智 8

你可以看看Jansson

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

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


Ale*_*lds 7

我将JSON-C用于工作项目并推荐它.轻量级,并通过开放许可发布.

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

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

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


R..*_*R.. 5

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

  • 当将JSON与非动态语言(如C)一起使用时,这是非常重要的一点.但这不是答案,所以应该真正对OP的问题进行评论. (2认同)