Невозможно десериализовать с помощью Serde: оператор `?` Можно использовать только в функции, которая возвращает `Result`
Я пытаюсь десериализовать строку json в структуру, но у меня проблемы с тем, чтобы заставить ее работать. Все, что я хочу сделать, это распечатать статус и / или результат первого соответствия run["meta"]["username"]
против данного имени пользователя.
Однако, несмотря на то, что я последовал данному примеру, я не могу заставить его работать. Теперь я предпочел бы сделать это с нетипизированными значениями, так как я не собираюсь хранить значения, но когда я делаю это, я не могу легко перебрать исходный массив, делая runs.as_array().iter()
кажется, возвращает Vec
с одним String
элемент, содержащий всю строку json, следовательно, необходимо добавить типизацию, но теперь это тоже не работает.
Текущая проблема, которую я получаю, заключается в следующем:
error[E0277]: the `?` operator can only be used in a function that returns `Result` (or another type that implements `std::ops::Try`)
--> src/main.rs:60:30
|
60 | let runs: Runs = serde_json::from_str(get_runs(&mut client,
| ______________________________^
61 | | &settings["pipeline_id"]).as_str())?;
| |____________________________________________________________________^ cannot use the `?` operator in a function that returns `()`
|
= help: the trait `std::ops::Try` is not implemented for `()`
= note: required by `std::ops::Try::from_error`
Что не имеет смысла, потому что если вы удалите ?
потом жалуется, что runs
ожидал Runs
и вместо этого получил Result
, так что я очень смущен, как он может жаловаться, что он возвращает Result
а потом жаловаться, что он возвращает ()
?
Очевидно, я что-то упускаю и просто не вижу этого.
Вторая проблема заключается в том, что я не могу использовать .iter()
на:
struct Runs(Vec<Run>);
Я знаю, что это упакованный Vec, но не должен ли он делегировать или что-то автоматически? Потому что я не могу использовать псевдоним типа или просто сделать:
let runs: Vec<Run> =
потому что мне нужно иметь:
# [производное (отладка, сериализация, десериализация)]
перед этим, чтобы позволить ему работать с ser-rs.
Итак, как мне решить две проблемы, которые позволят мне получить необходимые данные от json?
Вот минимальный (для ржавчины) пример:
extern crate serde_json;
#[macro_use]
extern crate serde_derive;
use std::collections::HashMap;
use serde_json::{Value, Error};
#[derive(Debug,Serialize, Deserialize)]
struct Runs(Vec<Run>);
#[derive(Debug,Serialize, Deserialize)]
struct Meta {
username: String
}
#[derive(Debug,Serialize, Deserialize)]
struct User {
meta: Meta,
}
#[derive(Debug,Serialize, Deserialize)]
struct Run {
status: String,
result: String
user: User,
}
fn main() {
let data = r#"
[
{
"id": "577a4dbc3ec144923a02b6f9",
"url": "https://app.wercker.com/api/v3/runs/577a4dbc3ec144923a02b6f9",
"branch": "master",
"commitHash": "cd74a9994712960f19b4b563491f860f98fa7bb5",
"createdAt": "2016-07-04T11:51:24.851Z",
"finishedAt": "2016-07-04T11:51:34.284Z",
"message": "My custom message!",
"progress": 57,
"result": "aborted",
"startedAt": "2016-07-04T11:51:25.996Z",
"status": "finished",
"user": {
"meta": {
"werckerEmployee": true,
"username": "tonnu"
},
"userId": "549101f36b3ba8733d88ce96",
"avatar": {
"gravatar": "bb95c388b227da2ce2f33c0811478095"
},
"name": "Toon",
"type": "wercker"
},
"pipeline": {
"id": "5751377e7e1bd5f17f050bc4",
"url": "https://app.wercker.com/api/v3/pipelines/5751377e7e1bd5f17f050bc4",
"createdAt": "2016-06-03T07:53:34.294Z",
"name": "initial-build",
"permissions": "public",
"pipelineName": "initial-build",
"setScmProviderStatus": true,
"type": "git"
}
}
]"#;
let runs: Runs = serde_json::from_str(data).as_str()?;
for run in runs.iter() {
println!("{}","------------");
println!("{:?}",run)
}
}