gpt4 book ai didi

rust - 使我自己的错误为serde_json反序列化

转载 作者:行者123 更新时间:2023-12-03 11:42:21 24 4
gpt4 key购买 nike

我正在尝试使用serde_json在Rust中将具有预先存在的格式的JSON文件反序列化为我自己的格式。
我想通过为该类实现一个反序列化器来做到这一点。
我的问题是JSON文件的格式可能会失真,raw_json_result仍可以正确解码,但结果数据结构本身也会格式错误。在这种情况下,我想返回一个错误。
在这里形成有效错误对象的机制是什么?我在想我想要Err(something_valid)行-我只是不知道如何制作something_valid

impl<'de> Deserialize<'de> for MyClass {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let raw_json_result = MyAliasedClassFromJson::deserialize(deserializer)?;
MyClass::from_cal_json::<D>(cal_json)
}
}

最佳答案

假设您有某种MyError类型,它实现了 Debug Display Error 。然后,如果您尝试返回Err(MyError::SomethingBadHappened),那么使其工作最直接的方法就是简单地添加 .map_err(D::Error::custom)

Err(MyError::SomethingBadHappened).map_err(D::Error::custom)

这是一个简短的示例:
use std::error;
use std::fmt;

// serde = "1.0"
use serde::de::Error;
use serde::{Deserialize, Deserializer};

#[derive(Debug)]
enum MyError {
YouAreNotBob,
// ...
}

impl error::Error for MyError {}

impl fmt::Display for MyError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
use MyError::*;
match self {
YouAreNotBob => write!(f, "YouAreNotBob"),
// ...
}
}
}

pub fn deserialize_bob<'de, D>(deserializer: D) -> Result<String, D::Error>
where
D: Deserializer<'de>,
{
let string = String::deserialize(deserializer)?;

if string == "bob" {
Ok(string)
} else {
Err(MyError::YouAreNotBob).map_err(D::Error::custom)
}
}

关于rust - 使我自己的错误为serde_json反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66230715/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com