9个稳定版本
1.0.8 | 2023年9月1日 |
---|---|
1.0.7 | 2023年6月29日 |
1.0.6 | 2023年5月21日 |
1.0.3 | 2022年12月23日 |
1.0.1 | 2022年11月24日 |
在过程宏中排名1299
每月下载量55次
在2个crate中使用(通过native-json)
26KB
490 行
Rust原生JSON
此crate为Rust提供原生JSON语法,它以强大的方式将JSON语法解析为原生Rust结构体。您可以像使用JavaScript一样原生地声明JSON对象,Rust中的JSON变得简单!
注意:此crate只是一个粗略的过程宏(编译器插件),更多功能请参阅native-json
使用方法
将依赖项添加到您的Cargo.toml中,serde_json
只在您想将JSON对象转换为字符串时需要。
[dependencies]
native-json = "1.2"
serde = {version = "1.0", features = ["derive"] }
serde_json = "1.0"
使用原生JSON对象的示例
use native_json::json;
use std::collections::HashMap;
use serde::{Deserialize, Serialize};
fn main()
{
let mut json = json!{
name: "native json",
style: {
color: "red",
size: 12,
bold: true,
range: null
},
array: [5,4,3,2,1],
vector: vec![1,2,3,4,5],
hashmap: HashMap::from([ ("a", 1), ("b", 2), ("c", 3) ]);,
students: [
{name: "John", age: 18},
{name: "Jack", age: 21},
],
};
// Native access
json.style.size += 1;
json.students[0].age += 2;
// Debug
println!("{:#?}", t);
// Stringify
let text = json.string().unwrap();
println!("{}", text);
}
声明一个命名的JSON结构体
使用JSON声明语法,您可以在原地声明嵌套的原生JSON对象。注意:带下划线后缀的标识符在序列化和反序列化时会重命名,type_
将被重命名为type
。
JSON声明语法
json!{
JSON_OBJECT_NAME {
name : type,
value: type?, // optional field when serialize & deserialize
type_: String, // suffix underscore will be removed when serialize & deserialize
array: [type],
object: {
name: type,
...
},
...
}}
native-json将为您生成原生Rust结构体,每个对象都由对象层次路径命名,路径之间用下划线连接。
JSON_OBJECT_NAME.object
被转换为JSON_OBJECT_NAME_object
JSON_OBJECT_NAME.array's item
被转换为JSON_OBJECT_NAME_array_item
使用命名的JSON对象的示例
use native_json::json;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
json!{
School {
name: String,
rank: u32?, // optional
students: [
{ name: String, age: u16 },
...
],
map: HashMap<String, String>,
nullable: Option<String>
}}
fn main()
{
let mut school = School::new();
school.name = "MIT".to_string();
school.map.insert("Tom".to_owned(), "Profile".to_owned());
// using initializer
let mut john = School_students_item::new();
john.name = "John".to_owned();
john.age = 18;
school.students.push(john);
// using struct
let jack = School_students_item { name: "Jack".to_string(), age: 21 };
school.students.push(jack);
// show
println!("{:#?}", school);
}
依赖项
~1.5MB
~34K SLoC