1 个不稳定版本

0.1.0 2023年2月2日

#992 in 编码

Download history 1459/week @ 2024-03-14 2237/week @ 2024-03-21 2663/week @ 2024-03-28 2533/week @ 2024-04-04 1776/week @ 2024-04-11 1406/week @ 2024-04-18 1719/week @ 2024-04-25 1100/week @ 2024-05-02 1781/week @ 2024-05-09 1014/week @ 2024-05-16 1832/week @ 2024-05-23 3653/week @ 2024-05-30 3329/week @ 2024-06-06 5496/week @ 2024-06-13 3861/week @ 2024-06-20 2117/week @ 2024-06-27

15,370 每月下载量
6 crates 中使用

Apache-2.0

72KB
2K SLoC

JSON5

一个用于使用 Serde 序列化和反序列化 JSON5 的 Rust 库。

本项目是 callum-oakley/json5-rs 的分支。


lib.rs:

JSON5 是一个扩展了 JSON 语法的超集,包括一些来自 ECMAScript 5.1 的产生式。

特别是,JSON5 允许注释、尾随逗号、不带引号的键、单引号字符串等。有关详细信息,请参阅 JSON5 项目页面

{
  // comments
  unquoted: 'and you can quote me on that',
  singleQuotes: 'I can use "double quotes" here',
  lineBreaks: "Look, Mom! \
No \\n's!",
  hexadecimal: 0xdecaf,
  leadingDecimalPoint: .8675309, andTrailing: 8675309.,
  positiveSign: +1,
  trailingComma: 'in objects', andIn: ['arrays',],
  "backwardsCompatible": "with JSON",
}

此 crate 提供了将 JSON5 文本反序列化为 Rust 数据类型的函数,以及将 Rust 数据类型序列化为 JSON5 文本的函数,两者都通过 Serde 框架 实现。

反序列化

在您的类型上实现 Serde 的 Deserialize 特性将允许您使用 from_str 将 JSON5 文本解析为该类型的值。

use serde_derive::Deserialize;

#[derive(Deserialize, Debug, PartialEq)]
struct Config {
    message: String,
    n: i32,
}

let config = "
    {
      // A traditional message.
      message: 'hello world',

      // A number for some reason.
      n: 42,
    }
";

assert_eq!(
    serde_json5::from_str(config),
    Ok(Config {
        message: "hello world".to_string(),
        n: 42,
    }),
);

有许多方式可以自定义反序列化(例如,将 camelCase 字段名反序列化为具有 snake_case 字段的结构体)。请参阅 Serde 文档,特别是 属性自定义序列化示例 部分。

序列化

同样,在Rust类型上实现 Serialize 允许您使用 to_string 生成该类型的JSON5序列化。目前序列化器只会生成JSON(因为它是JSON5的有效子集),但未来的工作将允许指定输出样式(单引号或双引号,尾随逗号,缩进等)。

use serde_derive::Serialize;

#[derive(Serialize, PartialEq, Debug)]
#[serde(untagged)]
enum Val {
    Number(f64),
    Bool(bool),
    String(String),
}

assert_eq!(
    serde_json5::to_string(&vec![
        Val::Number(42.),
        Val::Bool(true),
        Val::String("hello".to_owned()),
    ]),
    Ok("[42,true,\"hello\"]".to_owned()),
)

有许多方式可以自定义序列化(例如,将 snake_case 结构体字段序列化为 camelCase)。请参阅Serde文档,特别是属性自定义序列化示例部分。

局限性

在撰写本文时,以下内容不受支持

  • 将数据反序列化为借用类型(例如,类型为 &str 的字段)

  • 序列化或反序列化 字节数组

  • 指定序列化器的JSON5输出样式(单引号或双引号,尾随逗号,缩进等)

依赖项

~2.3–3MB
~63K SLoC