#json #json-parser #lexer #parse-json #data #parser #struct

parson

一个用于将 JSON 解析到 Rust 类型的 crate

3 个稳定版本

1.1.0 2022 年 9 月 13 日
1.0.1 2022 年 2 月 21 日
1.0.0 2022 年 2 月 20 日

解析器实现 中排名第 2835

GPL-3.0 许可证

55KB
1K SLoC

Parson

License Languages Top Language Commit Activity Last commit

Parson 是一个 Rust crate,可以将 JSON 字符串解析为 Rust 类型,以便在另一个 Rust 项目中使用

动机

我对 Rust 的兴趣迅速增长,因为我厌倦了 TypeScript 和 Web 开发。在 Rust 中制作 Parson 可能会让我比目前知道的更多关于 Rust 的知识。学习如何制作解析器也将教会我制作词法分析和解析器的步骤。这是制作我自己的 JavaScript 解释器,我的 Rust 梦想项目的垫脚石。

功能

  • JSON 解析到 Rust 类型
    • JSON 字符串解析为 Rust 所有权字符串
    • JSON 数字解析为 Rust f64
    • JSON 布尔值解析为 Rust bool
    • JSON 空值无法解析到 Rust,因为没有空值
  • 错误信息
    • 解析器会告诉你在哪一行和哪一列发生了解析错误

安装

将此添加到您的 Rust 项目的 Cargo.toml 文件中

[dependencies]
...
parson = "<version number>"

用法

由于 JSONValue 结构体实现了 FromStr,您可以直接从字符串解析它到 JSONValue。如果解析过程中发生错误,您将得到一个 JSONError

use parson::JSONValue;

fn main() {
    let json = r#"{ "key": "value" }"#;
    let json_value = json.parse::<JSONValue>().expect("JSON parse failed");
	println!("{}", json_value);
}

JSONValue 结构体

JSONValue 结构体包含以下数据之一

JSONValue 有获取每种类型值的方法

JSONValue 还具有检查值是否为每种类型的方法

  • is_string(): 布尔类型
  • is_number(): 布尔类型
  • is_boolean(): 布尔类型
  • is_null(): 布尔类型
  • is_array(): 布尔类型
  • is_object(): 布尔类型

JSONValue 有一个方法,返回它持有的值的枚举类型

let json_value = /* result of parsing a string */

match json_value.get_type() {
	JSONType::String(json_string) => println!("{}", json_string.get_string()),
	JSONType::Number(json_number) => println!("{}", json_number.get_number()),
	JSONType::Boolean(json_boolean) => println!("{}", json_boolean.get_boolean()),
	JSONType::Null(json_null) => println!("Null"),
	JSONType::Array(json_array) => println!("{} items", json_array.len()),
	JSONType::Object(json_object) => println!("{} pairs", json_object.len()),
}

JSONString 结构体

JSONString 结构体以 String 的形式保存了输入 JSON 中的字符串数据。 JSONString 实现包含一个方法来获取其内部的数据。

  • get_string(): String

JSONNumber 结构体

JSONNumber 结构体以 f64 的形式保存了输入 JSON 中的数字数据。 JSONNumber 实现包含一个方法来获取其内部的数据。

  • get_number(): f64

JSONBoolean 结构体

JSONBoolean 结构体以 bool 的形式保存了输入 JSON 中的布尔值数据。 JSONBoolean 实现包含一个方法来获取其内部的数据。

  • get_boolean(): 布尔类型

JSONNull 结构体

JSONNull 结构体代表了输入 JSON 中的 null 值。由于 Rust 没有表示 Null 值的方法,JSONNull 实现没有获取其内部数据的方法。

JSONArray 结构体

JSONArray 结构体以 Vec<JSONValue> 的形式保存了输入 JSON 中的数组数据。 JSONArray 实现包含 3 个方法来获取其内部的数据。

JSONObject 结构体

JSONObject 结构体存储了关于输入 JSON 中对象的元数据,以 IndexMap<String, JSONValue> 的形式,这是一个维护了数据添加顺序的 HashMap。`JSONObject` 实现了 3 个方法来获取其中的数据。

JSONError 结构体

JSONError 结构体存储了解析输入 JSON 时发生的错误信息。

JSONError 有一个方法可以获取其中的错误信息。

  • get_message(): String

致谢

我还在这里学习了如何制作一个基本的 JSON 解析器 这里。我理解并改进了作者编写词法分析和解析器的方式,使 Parson 更加健壮。

构建于

  • Rust
    • indexmap

依赖项

~1MB
~16K SLoC