如何在 Rust 中声明具有不同对象类型的数组

问题描述 投票:0回答:2

我有一个对 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,
}
rust vector struct actix-web
2个回答
0
投票

您可以使用枚举:

enum MyType {
   Float(f32),
   Integer(i32),
   Text(String),
}

那么你的结构看起来像这样:

pub struct Item {
    pub name: String,
    pub value: MyType,
}

0
投票

假设您实际上正在处理 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:?}")
    }
}

© www.soinside.com 2019 - 2024. All rights reserved.