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 在 解析器实现
每月下载量 86次
在 rdms 中使用
6.5MB
3.5K SLoC
为什么还需要另一个Rust JSON包?
该包在大型数据和文档数据库方面做了几项权衡。
- 支持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 排序的详细描述.
- Rust-lang issue#46298 和 issue#10184,讨论了 f64 -> 整数的饱和转换。
- Rust 内部讨论 f64 -> 整数。
- Unicode 排序 TR10。
- ICU 排序.
- 浮点数的 完全排序
- 关于浮点数完全排序的 stackoverflow。
- 在 http://users.rust-lang.org 上的 完全排序线程。
- 一篇关于浮点数的优秀 博客,以入门。
JSON 文档上的操作
- 算术操作,ADD、SUB、MUL、DIV、REM、NEG。
- 位运算,SHL,SHR,BITAND,BITOR,BITXOR。
- 逻辑运算,NOT,AND,OR。
- 索引操作。
- 范围操作。