Hacker News 中文摘要

RSS订阅

Sj.h:一个约150行C99代码的微型JSON解析库 -- Sj.h: A tiny little JSON parsing library in ~150 lines of C99

文章摘要

GitHub上的rxi/sj.h项目是一个轻量级的JSON解析库,旨在提供简单高效的JSON数据处理功能。该项目适合需要快速解析JSON数据的开发者使用,代码简洁且易于集成到各种应用中。

文章总结

GitHub - rxi/sj.h: 一个轻量级的JSON解析库

===============

项目简介

sj.h 是一个由 rxi 开发的轻量级 JSON 解析库,专为 C 语言设计。该库的核心特点是简洁高效,代码量仅为约 150 行 C99 标准代码,且不依赖任何外部库。它支持零内存分配,状态管理极为精简,并提供了带有行号和列号的错误信息提示。此外,sj.h 不处理数字和字符串的解析,开发者可以根据需求自行处理这些部分。

主要特性

  • 轻量级:代码量小,易于集成。
  • 零内存分配:减少内存开销,提升性能。
  • 错误定位:提供详细的错误信息,便于调试。
  • 灵活解析:不处理数字和字符串解析,开发者可自定义处理方式。

使用示例

以下是一个简单的示例,展示了如何使用 sj.h 从 JSON 字符串中加载矩形数据到 Rect 结构体中:

```c char *json_text = "{ \"x\": 10, \"y\": 20, \"w\": 30, \"h\": 40 }";

typedef struct { int x, y, w, h; } Rect;

bool eq(sjValue val, char *s) { sizet len = val.end - val.start; return strlen(s) == len && !memcmp(s, val.start, len); }

int main(void) { Rect rect = {0};

sj_Reader r = sj_reader(json_text, strlen(json_text));
sj_Value obj = sj_read(&r);

sj_Value key, val;
while (sj_iter_object(&r, obj, &key, &val)) {
    if (eq(key, "x")) { rect.x = atoi(val.start); }
    if (eq(key, "y")) { rect.y = atoi(val.start); }
    if (eq(key, "w")) { rect.w = atoi(val.start); }
    if (eq(key, "h")) { rect.h = atoi(val.start); }
}

printf("rect: { %d, %d, %d, %d }\n", rect.x, rect.y, rect.w, rect.h);
return 0;

} ```

更多使用示例可以在项目的 demo 文件夹中找到。

许可证

该项目采用 Unlicense 许可证,意味着它是完全免费且不受任何限制的软件,开发者可以自由使用、修改和分发。

项目状态

  • Stars: 313
  • Forks: 4
  • Watchers: 1

项目目前没有发布任何版本,所有代码均以 C 语言编写。

总结

sj.h 是一个非常适合嵌入式系统或对性能有严格要求的项目的 JSON 解析库。它的简洁性和灵活性使其成为开发者的理想选择。

评论总结

评论内容总结:

  1. 对库的实用性和适用性的质疑

    • 评论2(adrianN)质疑该库的实际用途,认为已有许多优秀的JSON库,并询问这是否是一个教学工具。
      • "What’s the usecase for something like this? There are lots of excellent libraries for json available. Is this a teaching tool?"
      • “这类库的用途是什么?已有许多优秀的JSON库。这是一个教学工具吗?”
  2. 对作者其他作品的赞赏

    • 评论3(lioeters)赞赏作者的其他作品,认为它们通常是单文件库,易于使用且文档完善。
      • "What I love about this author's work is that they're usually single-file libraries in ANSI C or Lua with focused scope, easy-to-use interface, and good documentation."
      • “我喜欢这位作者的作品,它们通常是ANSI C或Lua的单文件库,专注于特定范围,接口易于使用,文档完善。”
  3. 对JSON解析库的普遍批评

    • 评论4(codr7)认为JSON解析库通常复杂且难以使用,建议根据具体需求自行编写。
      • "JSON parser libraries in general is a black hole of suffering imo. They're either written with a different use case in mind, or a complex mess of abstractions; often both."
      • “JSON解析库通常是一个痛苦的黑洞。它们要么是为不同用例编写的,要么是复杂的抽象堆砌;通常两者兼有。”
  4. 对代码缺陷的指出

    • 评论5(fnord77)和评论6(layer8)指出代码中存在缺陷,如深度可能变为负数,以及未检查有符号整数溢出。
      • "feeding a stray '}' at the top level can result in depth becoming negative"
      • “在顶层输入一个多余的'}'可能导致深度变为负数。”
      • "The library doesn’t check for signed integer overflow here... Certain inputs can therefore trigger UB."
      • “该库未检查有符号整数溢出……某些输入可能因此触发未定义行为。”
  5. 对库的积极评价

    • 评论7(sim7c00)表示喜欢该库,认为它足够简单,可以用于学习或直接使用。
      • "love this, been looking to implement a simple json parser for some projects but this is small enough i can study it and either learn what i need or even use it."
      • “喜欢这个库,一直在寻找为某些项目实现一个简单的JSON解析器,但这个库足够小,我可以学习它,甚至直接使用它。”