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

Download history 16/week @ 2024-03-11 11/week @ 2024-03-18 10/week @ 2024-03-25 29/week @ 2024-04-01 4/week @ 2024-04-08 13/week @ 2024-04-15 6/week @ 2024-04-22 3/week @ 2024-05-06 2/week @ 2024-05-20 7/week @ 2024-05-27 1/week @ 2024-06-03 31/week @ 2024-06-10 18/week @ 2024-06-17 4/week @ 2024-06-24

每月下载量55
2个crate中使用(通过native-json

MIT许可证

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结构体,每个对象都由对象层次路径命名,路径之间用下划线连接。

  1. JSON_OBJECT_NAME.object被转换为JSON_OBJECT_NAME_object
  2. 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