这个错误提示是请求返回的数据不能被解码为 JSON 格式,可能是因为请求的 API 返回的数据格式不是 JSON 或者格式不正确。可以尝试打印出返回的数据,查看其格式,或者检查 API 文档中返回数据的格式要求。如果返回数据不是 JSON 格式,可以尝试使用其他格式的数据进行解码,比如 XML 或者文本格式。如果返回数据格式正确,但仍然无法解码,可以尝试使用其他的 JSON 库进行解码,或者联系 API 提供方寻求帮助。/n/n那怎么打印出返回的数据啊,我该如何修改代码/n/n可以在 send_post 函数中添加以下代码,用于打印返回的数据:/n/nrust/nlet response = client.post(/'https://free-api.cveoy.com/v3/completions/')/n .headers(header)/n .json(&data)/n .send()/n .await?;/n/nlet text = response.text().await?;/nprintln!(/'Response text '{text}';//n//nlet json = response.json<serde_json::Value>().await?;/nOk(json)/n/n/n这样就可以先打印出返回的原始数据,再尝试解码成 JSON 格式,方便排查问题。如果返回的数据格式正确,但无法解码为 JSON 格式,可以尝试查看 API 文档中数据格式的要求。/n/n/n/n这个代码返回多个json /n格式是这样的/n/n{/'type/':/'success/',/'completion/':/'//n//n/'}{/'type/':/'success/',/'completion/':/'Hello/'}{/'type/':/'success/',/'completion/':/' there/'}{/'type/':/'success/',/'completion/':/'!/'}{/'type/':/'success/',/'completion/':/' How/'}{/'type/':/'success/',/'completion/':/' can/'}{/'type/':/'success/',/'completion/':/' I/'}{/'type/':/'success/',/'completion/':/' assist/'}{/'type/':/'success/',/'completion/':/' you/'}{/'type/':/'success/',/'completion/':/' today/'}{/'type/':/'success/',/'completion/':/'?/'}/n/n/n我该如何获取它里面的completion 里的值/n/n可以对返回的 JSON 数据进行处理,将其中的每个 JSON 对象按顺序取出,然后获取其中的 completion 字段的值。可以用 serde_json 库中的 Deserializer 来实现这个功能。以下是修改后的代码示例:/n/nrust/nuse std::{io, collections::HashMap};/nuse reqwest::header::HeaderMap;/nuse serde::{Deserialize, Deserializer};/n/n#[tokio::main]/nasync fn main() {/n match send_post().await {/n Ok(res) => {/n // 解析返回的 JSON 数据/n let data: Vec<Completion> = serde_json::Deserializer::from_str(&res)/n .into_iter()/n .map(|v| Completion::deserialize(v).unwrap())/n .collect();/n /n // 获取 completion 字段的值/n let completions: Vec<String> = data.iter().map(|c| c.completion.clone()).collect();/n println!(/'{:#?}/', completions);/n /n Err(e) => {/n eprintln!(/'{:?}', e)/n }/n }/n}/n/n// 表示一个 completion 对象/n#[derive(Debug, Deserialize)]/nstruct Completion {/n #[serde(rename = /'completion/')]/n completion: String,/n}/n/nasync fn send_post() -> Result<String, reqwest::Error> {/n let client = reqwest::Client::new();/n let mut header = HeaderMap::new();/n header.insert(/'User-Agent//n /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./'),/n );/n header.insert(/'referer/', /'https//www.covery.com/'.parse().expect(/'unsolve the referer value./'));/n header.insert(/'sec-ch-ua/', /'sec-ch-ua/'.parse().expect(/'ms/'));/n/n let mut data = HashMap::new();/n data.insert(/'prompt/', /'hello/');/n/n Ok(client.post(/'https://free-api.cveoy.com/v3/completions/')/n .headers(header)/n .json(&data)/n .send()/n .await?/n .text()/n .await?)/n}/n/n/n这样就可以获取到每个 completion 对象中的 completion 字段的值,并以 Vec<String> 的形式打印出来。/n/n/nerror[E0432]: unresolved import serde/n --> src//main.rs:12:5/n |/n12 | use serde::{Deserialize,Deserializer};/n | ^^^^^ use of undeclared crate or module serde/n如何解决/n/n这个错误提示是因为缺少 serde 库,需要在 Cargo.toml 文件中添加依赖。可以在 [dependencies] 中添加以下内容:/n/ntoml/nserde = { version = /'1.0/', features = [/'derive/'] }/n/n/n然后在代码中使用 use serde::{Deserialize, Deserializer}; 导入需要使用的模块即可。如果还有其他 serde 相关的模块需要使用,可以根据需要进行导入。/n

如何解析多个 JSON 对象并获取 completion 字段的值?

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

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