gpt4 book ai didi

rust - Rust-使用serde/reqwest “Invalid type”反序列化

转载 作者:行者123 更新时间:2023-12-03 11:36:06 31 4
gpt4 key购买 nike

我正在尝试反序列化以下API响应(为简单起见,我仅复制数组的两个切片,但实际上它将更大)。该代码过分简化以演示该示例。
API回应:[[1609632000000,32185,32968,34873,31975,18908.90248876],[1609545600000,29349.83250154,32183,33292,29000,22012.92431526]]因此,它是一个大数组/向量,由具有六个整数OR浮点数的数组/向量组成(它们的位置也会有所不同)。
为此,我正在尝试使用泛型,但是似乎缺少了一些东西,因为无法对其进行编译。
它失败了thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: reqwest::Error { kind: Decode, source: Error("invalid type: integer `1609632000000`, expected struct T", line: 1, column: 15) }'

use blocking::Response;
use serde::{Deserialize, Serialize};
use reqwest::{blocking, Error, StatusCode};

struct allData<T> {
data: Slice<T>
}

#[derive(Debug, Serialize, Deserialize)]
struct Slice<T>{
data1: T,
data2: T,
data3: T,
data4: T,
data5: T,
data6: T,

}


fn get_data() -> Option<Slice> /*I know the signature is not correct, read until the end for the correct one*/ {
let url = format!("{}", my_url_string);
let response: Slice<T> = blocking::get(&url).unwrap().json().unwrap();
Some(response);


}

fn main() {
let call_the_api = get_data();
println!("{:?}", call_the_api);
}
什么是将Struct与可返回“Slice”向量的泛型一起使用的正确方法?
IE。
Vector{
Slice {
data1,
data2,
data3,
data4,
data5,
data6,
},
Slice {
data1,
data2,
data3,
data4,
data5,
data6,
}
}

最佳答案

Deserialize结构上派生Slice不适用于JSON数组,相反,它期望包含字段data1data2等的JSON dict。大概,您不想为您的类型手动实现Deserialize特性,因此,您需要Vec<Vec<T>>对嵌套数组进行建模:

#[derive(Deserialize)]
#[serde(transparent)]
struct AllData<T>(Vec<Vec<T>>);
此类型将 Vec中的所有项目限制为 T类型。这意味着,您不必使用某些 f64和某些 i64,它们要么全部为浮点数,要么全部为整数。为了使这个包装器在浮点数和整数上都通用,您可能需要一些枚举:
#[derive(Deserialize)]
// note, this causes deserialization to try the variants top-to-bottom
#[serde(untagged)]
enum FloatOrInt {
Int(i64),
Float(f64),
}
使用该枚举,就不再需要 T上的类型参数 AllData,您可以进行以下操作:
#[derive(Deserialize)]
#[serde(transparent)]
struct AllData(Vec<Vec<FloatOrInt>>);
如果确定内部数组的长度始终为6,则可以将其替换为数组: [FloatOrInt; 6]
放在一起,您将得到如下内容:
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=52bd3ce7779cc9b7b152c681de8681c4

关于rust - Rust-使用serde/reqwest “Invalid type”反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66641145/

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