json - 从 Hyper 获取请求,解析 JSON,并将其转换为 Rust 中的结构

标签 json rust serde hyper

我正在尝试制作一个接受一些参数作为 JSON 的网络服务器,并将它们转换为一个结构,然后将其存储在我的应用程序的其他地方。

我在名为 status.rs 的文件中有这个数据结构:

use serde::{Serialize, Deserialize};

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Status {
    pub id: String,
    pub rssi: Option<i8>,
    pub carrier: Option<String>,
    pub timestamp: u64,
}

然后我在 Hyper 的服务中使用以下代码来尝试解析请求的主体并将其转换为我的结构。唯一的区别是我想在服务器上根据时间戳添加时间戳字段,而不是在客户端:

let timestamp: u64 = SystemTime::now()
    .duration_since(UNIX_EPOCH)
    .expect("PANIC! Time is running backwards!")
    .as_secs();

Box::new(req.into_body().concat2().map(|body| {
    let body_bytes = body.into_bytes();
    let body_str = match str::from_utf8(&body_bytes) {
        Ok(v) => v,
        Err(e) => {
            // TODO: this is shitty error handling
            panic!("Unable to read UTF8 input: {}", e);
        }
    };
    let input_data: Value = serde_json::from_str(body_str).unwrap();
    let data = Status {
        id: input_data.get("id").unwrap(),
        timestamp: timestamp,
        rssi: input_data.get("rssi"),
        carrier: input_data.get("carrier"),
    };

    update(data);
}));

更新函数只是将其插入到数据存储结构中。

我试过用几种不同的方式来做到这一点,但这种方式给我带来了一个问题,即这些字段中的每一个都是 Option<&Value> 类型的(我认为)。

希望我尝试实现的结果足够清晰,我只是不知道如何获取请求正文、解析 JSON、添加时间戳并将其打包到一个结构中,然后将其存储在我的数据库。

我该怎么办?

最佳答案

您正在尝试将主体转换为字节切片,然后转换为字符串,然后转换为 serde_json::Value,然后转换为 Status。很多不必要的中间步骤,对吧?只需阅读文档:

let body = req.into_body().concat2().wait().unwrap().into_bytes();
let s: Status = serde_json::from_slice(&body).unwrap();

关于json - 从 Hyper 获取请求,解析 JSON,并将其转换为 Rust 中的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54726065/

相关文章:

java - 如何反序列化 JSON 数组?

rust - 如何获取枚举的整数值?

rust - 序列化时跳过结构字段

compiler-errors - 在编译时发出警告?

json - serde_json - 如何使我的结构可转换为 json 或转换为 json?

rust - 特征 `serde::Deserialize<' _ >` is not implemented for ` diesel_geography::types::GeogPoint`

json - 使用象鸟 jar 的 pig JsonLoader()错误处理Twitter的复杂json对象

java - 动态更改 bean 中的键名到 JSON 转换

java - ResponseBody 方法和普通方法的多个异常处理程序

path - 给定两条绝对路径,如何表达其中一条路径相对于另一条路径?