Rust JSON路径处理库serde_json_path_macros_internal的使用:高效解析与操作JSON数据的宏工具

Rust JSON路径处理库serde_json_path_macros_internal的使用:高效解析与操作JSON数据的宏工具

serde_json_path_macros_internal 是 serde_json_path crate 使用的内部库。

安装

在项目目录中运行以下Cargo命令:

cargo add serde_json_path_macros_internal

或者在Cargo.toml中添加以下行:

serde_json_path_macros_internal = "0.1.2"

元数据

  • 版本:0.1.2
  • 发布时间:10个月前
  • 2021 edition
  • 许可证:MIT
  • 大小:5.42 KiB

文档

可以在文档网站上查看文档。

仓库

项目仓库位于GitHub。

所有者

  • Trevor Hilton

完整示例代码

// 注意:serde_json_path_macros_internal 是内部库,通常不直接使用
// 以下是使用 serde_json_path 的示例代码:

use serde_json::{json, Value};
use serde_json_path::JsonPath;

fn main() {
    // 创建示例JSON数据
    let data: Value = json!({
        "store": {
            "book": [
                {
                    "category": "reference",
                    "author": "Nigel Rees",
                    "title": "Sayings of the Century",
                    "price": 8.95
                },
                {
                    "category": "fiction",
                    "author": "Evelyn Waugh",
                    "title": "Sword of Honour",
                    "price": 12.99
                }
            ],
            "bicycle": {
                "color": "red",
                "price": 19.95
            }
        }
    });

    // 创建JSON路径查询
    let path = JsonPath::parse("$.store.book[*].author").unwrap();
    
    // 执行查询
    let authors = path.query(&data).all();
    
    // 打印结果
    println!("Authors: {:?}", authors);
    // 输出: Authors: ["Nigel Rees", "Evelyn Waugh"]
}

这个示例展示了如何使用 serde_json_path 库来查询JSON数据中的特定字段。虽然 serde_json_path_macros_internal 是内部实现细节,但通过 serde_json_path 提供的API可以方便地进行JSON路径查询。

扩展示例代码

// 更完整的 serde_json_path 使用示例
use serde_json::{json, Value};
use serde_json_path::{JsonPath, Error};

fn main() -> Result<(), Error> {
    // 创建更复杂的JSON数据结构
    let data: Value = json!({
        "users": [
            {
                "id": 1,
                "name": "Alice",
                "contact": {
                    "email": "alice@example.com",
                    "phone": "123-456-7890"
                },
                "roles": ["admin", "user"]
            },
            {
                "id": 2,
                "name": "Bob",
                "contact": {
                    "email": "bob@example.com",
                    "phone": null
                },
                "roles": ["user"]
            }
        ],
        "settings": {
            "theme": "dark",
            "notifications": true
        }
    });

    // 示例1:查询所有用户的邮箱
    let email_path = JsonPath::parse("$.users[*].contact.email")?;
    let emails = email_path.query(&data).all();
    println!("User emails: {:?}", emails);

    // 示例2:查询具有admin角色的用户
    let admin_path = JsonPath::parse("$.users[?(@.roles contains 'admin')]")?;
    let admins = admin_path.query(&data).all();
    println!("Admin users: {:?}", admins);

    // 示例3:修改JSON数据
    if let Value::Array(users) = &mut data["users"] {
        for user in users {
            if let Some(phone) = user["contact"]["phone"].as_str() {
                println!("User {} has phone: {}", user["name"], phone);
            }
        }
    }

    // 示例4:使用路径表达式检查设置
    let theme_path = JsonPath::parse("$.settings.theme")?;
    let theme = theme_path.query(&data).exactly_one()?;
    println!("Current theme: {}", theme);

    Ok(())
}

这个扩展示例展示了更多serde_json_path的功能:

  1. 查询嵌套JSON结构中的特定字段
  2. 使用条件表达式过滤结果
  3. 修改和访问JSON数据
  4. 处理可能为null的字段
  5. 使用不同的查询方法(exactly_one, all等)

1 回复

Rust JSON路径处理库serde_json_path_macros_internal的使用指南

简介

serde_json_path_macros_internal是一个Rust宏工具库,用于高效解析和操作JSON数据。它基于serde_json和JSON路径表达式,提供了编译时检查的JSON路径查询功能。

主要特性

  • 编译时JSON路径验证
  • 类型安全的JSON操作
  • 高性能的JSON数据处理
  • 简洁的宏语法

使用方法

添加依赖

首先在Cargo.toml中添加依赖:

[dependencies]
serde_json = "1.0"
serde_json_path_macros_internal = "0.1"

基本用法

use serde_json::{json, Value};
use serde_json_path_macros_internal::json_path;

fn main() {
    // 示例JSON数据
    let data: Value = json!({
        "store": {
            "book": [
                {
                    "category": "reference",
                    "author": "Nigel Rees",
                    "title": "Sayings of the Century",
                    "price": 8.95
                },
                {
                    "category": "fiction",
                    "author": "Evelyn Waugh",
                    "title": "Sword of Honour",
                    "price": 12.99
                }
            ],
            "bicycle": {
                "color": "red",
                "price": 19.95
            }
        }
    });

    // 使用json_path!宏查询所有书籍
    let books = json_path!(data, "$.store.book[*]");
    println!("All books: {:?}", books);

    // 获取所有价格(递归查询)
    let prices = json_path!(data, "$..price");
    println!("All prices: {:?}", prices);

    // 获取第一本书的作者
    let first_author = json_path!(data, "$.store.book[0].author");
    println!("First author: {:?}", first_author);
}

高级用法

use serde_json::{json, Value};
use serde_json_path_macros_internal::json_path;

fn main() {
    let data: Value = json!({
        "users": [
            {"id": 1, "name": "Alice", "active": true},
            {"id": 2, "name": "Bob", "active": false},
            {"id": 3, "name": "Charlie", "active": true}
        ]
    });

    // 条件查询:查找所有活跃用户的名字
    let active_users = json_path!(data, "$.users[?(@.active == true)].name");
    println!("Active users: {:?}", active_users);

    // 多路径查询:获取前两个用户的ID和名字
    let user_info = json_path!(data, "$.users[0:2].{id: id, name: name}");
    println!("First two users: {:?}", user_info);

    // 表达式计算:计算所有用户ID的总和
    let total = json_path!(data, "sum($.users[*].id)");
    println!("Sum of user IDs: {:?}", total);
}

常见JSON路径表达式

表达式 描述
$.store.book[*].author 获取所有书的作者
$..price 获取所有价格
$.store.book[0] 获取第一本书
$.store.book[-1:] 获取最后一本书
$.store.book[0,1] 获取前两本书
$.store.book[?(@.price < 10)] 获取价格小于10的书
$.store.book[?(@.author =~ /.*Rees/)] 获取作者名包含"Rees"的书

性能提示

  1. 尽可能在编译时确定JSON路径
  2. 对于复杂查询,考虑将JSON路径分解为多个简单查询
  3. 重复使用解析后的JSON路径表达式

错误处理

use serde_json_path_macros_internal::json_path;

fn process_json(data: &serde_json::Value) -> Result<(), Box<dyn std::error::Error>> {
    // 无效的JSON路径会在编译时报错
    let result = json_path!(data, "$.invalid.path");
    
    if result.is_empty() {
        println!("No data found at path");
    } else {
        println!("Found data: {:?}", result);
    }
    
    Ok(())
}

完整示例

use serde_json::{json, Value};
use serde_json_path_macros_internal::json_path;

fn main() {
    // 创建复杂的JSON数据结构
    let data: Value = json!({
        "company": {
            "name": "TechCorp",
            "departments": [
                {
                    "name": "Engineering",
                    "employees": [
                        {"id": 101, "name": "John", "skills": ["Rust", "Python"], "salary": 85000},
                        {"id": 102, "name": "Jane", "skills": ["Java", "Go"], "salary": 92000}
                    ],
                    "budget": 500000
                },
                {
                    "name": "Marketing",
                    "employees": [
                        {"id": 201, "name": "Mike", "skills": ["SEO", "Content"], "salary": 75000},
                        {"id": 202, "name": "Sarah", "skills": ["Social", "Ads"], "salary": 78000}
                    ],
                    "budget": 300000
                }
            ],
            "locations": ["New York", "San Francisco", "London"]
        }
    });

    // 1. 获取所有部门名称
    let dept_names = json_path!(data, "$.company.departments[*].name");
    println!("Department names: {:?}", dept_names);

    // 2. 获取所有员工ID
    let employee_ids = json_path!(data, "$..employees[*].id");
    println!("Employee IDs: {:?}", employee_ids);

    // 3. 获取薪资超过80000的员工
    let high_earners = json_path!(data, "$..employees[?(@.salary > 80000)]");
    println!("High earners: {:?}", high_earners);

    // 4. 获取掌握Rust技能的员工
    let rust_devs = json_path!(data, "$..employees[?(@.skills contains 'Rust')]");
    println!("Rust developers: {:?}", rust_devs);

    // 5. 获取第一个部门的预算
    let first_dept_budget = json_path!(data, "$.company.departments[0].budget");
    println!("First department budget: {:?}", first_dept_budget);

    // 6. 错误处理示例
    match process_json(&data) {
        Ok(_) => println!("Processing completed"),
        Err(e) => println!("Error: {}", e),
    }
}

fn process_json(data: &Value) -> Result<(), Box<dyn std::error::Error>> {
    // 尝试查询不存在的路径
    let result = json_path!(data, "$.nonexistent.path");
    
    if result.is_empty() {
        println!("Warning: No data found at specified path");
    }
    
    // 有效的查询
    let locations = json_path!(data, "$.company.locations");
    println!("Company locations: {:?}", locations);
    
    Ok(())
}

这个库特别适合需要高效处理JSON数据且要求编译时安全检查的Rust应用场景。

回到顶部