21 个稳定版本

1.2.10 2023年12月10日
1.2.5 2023年9月1日
1.2.4 2023年6月29日
1.2.3 2023年5月22日
0.0.1 2022年11月9日

编码 中排名 #350

每月下载量 47 次
用于 wsd

MIT 许可证

13KB
134

Rust 本地 JSON

此crate为Rust提供本地JSON语法,它以一种强大的方式将JSON语法解析到本地Rust结构中。您可以像在JavaScript中一样声明原生JSON对象,Rust中的JSON变得简单易用!

用法

将依赖项添加到您的 Cargo.toml

[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.stringify(4);
    println!("{}", text);
}

声明一个命名的JSON结构

使用JSON声明语法,您可以在原地声明嵌套的原生JSON对象。

JSON声明语法

json!{
JSON_OBJECT_NAME { 
    state: i32?,    // optional field
    type_: String,  // suffix underscore will be removed when serialize & deserialize
    name : type, 
    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,
    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);
}

依赖项

~0.7–1.5MB
~34K SLoC