rust 使用节组织数据的

db2dz4w8  于 2023-05-18  发布在  其他
关注(0)|答案(1)|浏览(94)

如果我可以访问一个API并以JSON的形式获取数据,我该如何组织它并在Rust代码中使用它?我正在尝试理解如何创建一个包含节的结构体。例如,要创建这样的结构:

struct mainstruct {
   section1 : {
      brand : "something",
      price : "whatever",
   },
   section2 : {
     title : "here",
     description : "many",         
   },
}

我是否用这两个节创建两个impl,并将它们包含在一个新的结构中?
我是否创建两个enum并将这些enum包含在一个新结构中?
我使用以下代码从一个虚拟API获取数据:

use reqwest::{Client, Error};
use serde::{Deserialize, Serialize};

#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Product {
    pub id: i64,
    pub title: String,
    pub description: String,
    pub price: i64,
    pub rating: f64,
    pub stock: i64,
    pub brand: String,
    pub category: String,
    pub thumbnail: String,
    pub images: Vec<String>,
}

#[tokio::main]
async fn main() -> Result<(), Error> {
    let product: Product = Client::new()
        .get("https://dummyjson.com/products/1")
        .send()
        .await?
        .json()
        .await?;
    println!(">>>>>  Brand is : {:#?}", product.brand);
    Ok(())
}

我如何创建某种类型的数据,以这样的方式组织/呈现它?

info {
  price : Product.price,
  category : Product.category,
},
data {
  title : Product.title,
  description : Product.description,
}
sy5wg1nm

sy5wg1nm1#

Rust不支持嵌套结构定义;如果你想的话,他们需要分开

struct Product {
    info: ProductInfo,
    data: ProductData,
}

struct ProductInfo {
    brand: String,
    price: i64,
    /* ... */
}

struct ProductData {
    title: String,
    description: String,
    /* ... */
}

虽然现在这个结构与API中的JSON结构不同。在这种情况下,您可以聪明地使用#[serde(flatten)]demo on the playground)。
但如果这不合适,你可能需要为你的“域”(你想在内部使用的)和“数据传输”(只用于与其他东西接口)有单独的类型定义,并可能实现From来定义彼此之间的转换(demo on the playground)。

相关问题