12个版本 (7个重大变更)

0.8.1 2022年10月20日
0.8.0 2021年9月3日
0.7.0 2021年3月13日
0.6.2 2019年6月22日
0.2.0 2018年12月28日

#2177解析器实现

Download history 2/week @ 2024-03-15 45/week @ 2024-03-29 8/week @ 2024-04-05

每月下载量 86次
rdms 中使用

MIT 许可证

6.5MB
3.5K SLoC

为什么还需要另一个Rust JSON包?

Rustdoc GitPitch Build Status

该包在大型数据和文档数据库方面做了几项权衡。

  • 支持128位有符号整数。
  • 延迟转换JSON数字。
  • 从Rust原生类型到JSON文本的序列化。
  • 从JSON文本到Rust原生类型的反序列化。
  • 使用JSON指针在JSON文档上执行CRUD操作。
  • 属性对象中的键排序。
  • 流式JSON解析器。
  • 支持JSON5标准。
  • 常见的算术和逻辑操作。
  • 可排序的JSON。

有用的链接

数字延迟转换

将JSON数字转换为Rust原生类型并不总是所需的。特别是在大数据的上下文中,数据以JSON格式存储,我们只需要查找文档中的特定字段。

此实现提供了对JSON数字的延迟转换,从而实现了高达30%的性能提升。

注意:如果数字文本大于128个字符,则延迟转换不会生效,即文本应立即解析。

在JSON文档上执行CRUD操作

使用Json Pointer可以识别JSON文档中嵌套的特定字段。例如,对于以下文档

  {
    "age": 26,
    "eyeColor": "green",
    "name": "Leon Robertson",
    "gender": "male",
    "company": "AEORA",
    "phone": "+1 (835) 447-2960",
    "tags": [ "officia", "reprehenderit", "magna" ],
    "friends": [
      {
        "id": 0,
        "name": "Glenda Chan"
      }
    ]
  }
  • /age 应指向值 26
  • /tags 应指向值 [ "officia", "reprehenderit", "magna" ]
  • /tags/0 应指向值 "officia"
  • /friends 应指向值 [{"id": 0, "name": "Glenda Chan"}]
  • /friends/name 应指向值 "Glenda Chan"

操作列表

  • 使用 JSON Pointer 获取 JSON 文档内的嵌套字段。
  • 设置 JSON 文档内的嵌套字段。
  • 删除 JSON 文档内的嵌套字段。
  • 向 JSON 文档内追加字符串或数组字段。

JSON5

  • 对象键可以是 ECMAScript 5.1 的 IdentifierName。
  • 对象可以有一个尾随逗号。
  • 数组可以有一个尾随逗号。
  • 字符串可以使用单引号。
  • 字符串可以通过转义换行符跨多行。
  • 字符串可以包含字符转义。
  • 数字可以是十六进制。
  • 数字可以有前导或尾随小数点。
  • 数字可以是 IEEE 754 正无穷,负无穷,和 NaN。
  • 数字可以以显式的加号开头。
  • 允许单行和多行注释。
  • 允许额外的空白字符。

跟踪此功能.

可排序的 JSON

  • Null 类型应排在所有其他类型之前。
  • Boolean 类型应排在 Null 类型之后。
  • Number 类型应排在 Boolean 类型之后。
    • 当 f64 值 <= -2^127 时,将排序在所有 i128 整数之前。
    • 当 f64 值 >= 2^127-1 时,将排序在所有 i128 整数之后。
    • NaN(非数字)值应排在所有 i128 整数之后。
    • -Infinity 应排在所有数字之前。
    • +Infinity 应排在所有数字之后。
    • NaN 应排在 +Infinity 之后。
  • String 类型应排在 Number 类型之后。
  • Array 类型应排在 String 类型之后。
  • Object 类型应排在 Array 类型之后。
    • 对象内的所有 (键,值) 对应基于键进行预排序。
    • 比较两个对象时,比较应从第一个键开始,到最后一个键。
    • 如果在对象的给定位置上两个键相等,则比较其对应的值。
    • 如果一个对象是另一个对象的子集,例如,如果一个对象包含另一个对象所有的 (键,值) 属性,则它应排在另一个对象之前。

有用的链接

JSON 文档上的操作

  • 算术操作,ADD、SUB、MUL、DIV、REM、NEG。
  • 位运算,SHL,SHR,BITAND,BITOR,BITXOR。
  • 逻辑运算,NOT,AND,OR。
  • 索引操作。
  • 范围操作。

详细描述请见此处.

贡献

  • 简单工作流程。Fork - 修改 - 提交拉取请求。
  • 在创建PR之前,
    • 运行make build以确认所有构建版本均通过,且没有警告和错误。
    • 运行check.sh,确保没有警告、错误,并且所有测试用例通过。
    • 运行perf.sh,确保没有警告、错误,并且所有测试用例通过。
    • 安装并运行cargo spellcheck以移除常见的拼写错误。
  • 优先使用开发者来源证书

依赖项