【问题标题】:Getting a request from Hyper, parsing the JSON, and turning it into a struct in rust从 Hyper 获取请求,解析 JSON,并将其转换为 rust 中的结构
【发布时间】:2019-02-17 13:53:05
【问题描述】:

我正在尝试创建一个网络服务器,它接受一些 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&lt;&amp;Value&gt; 类型(我认为)。

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

我该怎么办?

【问题讨论】:

  • 有什么问题?
  • 我想从请求正文中解析JSON,添加一个字段,然后将其解析为Status 结构,我不太清楚如何去做。
  • 你搞清楚了吗?
  • @JustinThomas:我没有 :(

标签: json rust serde hyper


【解决方案1】:

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

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

【讨论】:

  • 谢谢,那肯定更好,但我仍然不确定如何添加这个额外的时间戳字段,它不是Option(因为没有一个Status 无效)因为它不包含在请求正文中。
  • 无限期地为我调用等待块,因为它在超级请求处理程序中。
猜你喜欢
  • 2020-08-31
  • 1970-01-01
  • 2020-12-03
  • 2019-05-24
  • 1970-01-01
  • 1970-01-01
  • 2012-09-13
  • 2018-11-07
  • 2013-06-11
相关资源
最近更新 更多