我有一个对 API 的回调,它返回一个对象,其中的一项作为不同类型的向量。在 Rust 中,向量只能用一种类型的元素来声明。我该如何解决这个问题?
{
"Body": {
"xxx": {
"xxx": "29115-34620561-1",
"xxx": "ws_CO_191220191020363925",
"xxx": 0,
"xxx": "The service request is processed successfully.",
"CallbackMetadata": {
"Item": [{
"Name": "Amount",
"Value": 1.00
},
{
"Name": "ReceiptNumber",
"Value": "NLJ7RT61SV"
},
{
"Name": "Date",
"Value": 20191219102115
},
{
"Name": "number",
"Value": 74149
}]
}
}
}
}
在主体对象中,回调对象具有 Item,它是不同类型的向量。如何将向量类型声明为具有不同类型作为 CallbackMetadata.Items 结构中的元素?
我尝试将每个 Item 的值声明为 Any 类型,但无法击败编译器。
pub struct Item {
pub name: String,
pub value: dyn Any,
}
您可以使用枚举:
enum MyType {
Float(f32),
Integer(i32),
Text(String),
}
那么你的结构看起来像这样:
pub struct Item {
pub name: String,
pub value: MyType,
}
假设您实际上正在处理 JSON,我强烈建议使用
serde-json
库,它有一个 Value
枚举,表示所有有效的 JSON 值:
use serde_json::Value;
const TEXT: &str = r#"
{
"Body": {
"xxx": {
"xxx": "29115-34620561-1",
"xxx": "ws_CO_191220191020363925",
"xxx": 0,
"xxx": "The service request is processed successfully.",
"CallbackMetadata": {
"Item": [{
"Name": "Amount",
"Value": 1.00
},
{
"Name": "ReceiptNumber",
"Value": "NLJ7RT61SV"
},
{
"Name": "Date",
"Value": 20191219102115
},
{
"Name": "number",
"Value": 74149
}]
}
}
}
}
"#;
fn main() {
let json: Value = serde_json::from_str(TEXT).expect("valid json");
let items = json["Body"]["xxx"]["CallbackMetadata"]["Item"]
.as_array()
.expect("Item to be an array");
for item in items {
println!("Item: {item:?}")
}
}