使用Serde反序列化可能为空的字符串

时间:2018-08-05 21:09:41

标签: rust serde

我已经读过the docs,但是还没有找到解决问题的方法。我正在解析一个API响应,该响应成功后将仅返回2xx状态代码,而在错误请求时将发送JSON。

extern crate serde;
#[macro_use]
extern crate serde_derive;
extern crate serde_json;

fn main() {
    let _: X = serde_json::from_str(r#"{ "ok": true }"#).expect("with string");
    let _: X = serde_json::from_str("").expect("empty string");
}

#[derive(Deserialize)]
struct X {
    ok: Option<bool>,
}

Playground

这是我想反序列化的结构。我尝试将#[serde(skip_serializing_if = "some_func")]添加到该字段中,但没有任何改变。

错误是

Error("EOF while parsing a value", line: 1, column: 0)

是否有办法正确处理此问题,或者在尝试反序列化响应之前是否总是需要检查状态码是否为2xx?

1 个答案:

答案 0 :(得分:1)

这里的主要问题是,根据大多数解析器,包括内置于ES6和显然是Serde的解析器,空字符串不是有效的JSON。对于这个问题,我有三种可能的解决方案。

  • 从端点返回空字典
  • 不要盲目尝试对响应正文的内容长度进行检查的空字符串反序列化。
  • 实施自定义Deserialize方法