use std::{io, collections::HashMap};
use reqwest::header::HeaderMap;
use serde::{Deserialize, Deserializer};

#[tokio::main]
async fn main() {
    match send_post().await {
        Ok(res) => {
            // 解析返回的 JSON 数据
            let data: Vec<Completion> = serde_json::Deserializer::from_str(&res)
                .into_iter()
                .map(|v| Completion::deserialize(v).unwrap())
                .collect();
            
            // 获取 completion 字段的值
            let completions: Vec<String> = data.iter().map(|c| c.completion.clone()).collect();
            println!('{:#?}', completions);
        }
        Err(e) => {
            eprintln!('{:?}', e)
        }
    }
}

// 表示一个 completion 对象
#[derive(Debug, Deserialize)]
struct Completion {
    #[serde(rename = 'completion')]
    completion: String,
}

async fn send_post() -> Result<String, reqwest::Error> {
    let client = reqwest::Client::new();
    let mut header = HeaderMap::new();
    header.insert('User-Agent',
                  'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) \
                  Chrome/110.0.0.0 Safari/537.36'.parse().expect('unsolve the userAgent header value.'),
    );
    header.insert('referer', 'https//www.covery.com'.parse().expect('unsolve the referer value.'));
    header.insert('sec-ch-ua', 'sec-ch-ua'.parse().expect('ms'));

    let mut data = HashMap::new();
    data.insert('prompt', 'hello');

    Ok(client.post('https://free-api.cveoy.com/v3/completions')
        .headers(header)
        .json(&data)
        .send()
        .await?
        .text()
        .await?)
}

这段代码使用 serde_json 库中的 Deserializer 来解析返回的 JSON 数据,并提取每个 completion 字段的值。具体步骤如下:

  1. 将返回的 JSON 数据字符串转换为 serde_json::Deserializer 对象。
  2. 使用 into_iter() 方法将 Deserializer 转换为迭代器。
  3. 使用 map() 方法将每个 JSON 对象解析为 Completion 结构体。
  4. 使用 collect() 方法将解析后的 Completion 结构体集合转换为 Vec<Completion>
  5. 使用 iter() 方法遍历 Vec<Completion>,并使用 map() 方法提取每个 Completion 结构体的 completion 字段的值。
  6. 使用 collect() 方法将提取的 completion 值转换为 Vec<String>

通过以上步骤,就可以成功地获取每个 completion 对象中的 completion 字段的值,并将其存储在 Vec<String> 中。

注意:

  • serde_json 库需要提前在项目中添加依赖。
  • Completion 结构体需要使用 #[derive(Deserialize)] 特性来实现 Deserialize trait,以便可以从 JSON 数据中解析。
  • completion 字段使用 #[serde(rename = 'completion')] 特性来指定从 JSON 数据中获取的字段名称。

希望这个修改后的代码示例能够帮助你解决问题。如果你还有其他问题,请随时提出。

Rust 使用 reqwest 库发送 POST 请求并解析 JSON 数据

原文地址: https://www.cveoy.top/t/topic/lBNh 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录