#json #rust
Вопрос:
У меня возникли проблемы при попытке заставить Rust загрузить файл JSON. Компиляция выполняется, но во время выполнения возникает ошибка, и она завершается.Кроме того, код ошибки не найден.
Исходный код является
use iced::{
executor, Align, Application, Clipboard, Column, Command, Element,
Length, Row, Settings, Text,
};
use serde::{Serialize, Deserialize};
use std::collections::HashMap;
use std::fs::File;
use std::io::BufReader;
#[derive(Serialize, Deserialize, Debug)]
#[serde(rename_all = "PascalCase")]
struct Tasks {
task: Task
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(rename_all = "PascalCase")]
struct Task {
deadline: String,
details: String,
user: HashMap<String, String>
}
struct GUI;
impl Application for GUI {
type Executor = executor::Defau<
type Message = ();
type Flags = ();
fn new(_flags: ()) -> (GUI, Command<Self::Message>) {
(GUI, Command::none())
}
/// Sets the window title.
fn title(amp;self) -> String {
String::from("rust_gui_test")
}
fn update(
amp;mut self,
_message: Self::Message,
_clipboard: amp;mut Clipboard,
) -> Command<Self::Message> {
Command::none()
}
fn view(amp;mut self) -> Element<Self::Message> {
let file = File::open("task.json").unwrap();
let reader = BufReader::new(file);
let deserialized: Tasks = serde_json::from_reader(reader).unwrap();
let serialized = deserialized.task.deadline;
let json_data = serde_json::to_string(amp;serialized).unwrap(); //amp;alloc::String::String
let textarea = Text::new(json_data).size(60);
// prepare column
Column::new()
.push(textarea)
.push(
Row::new()
.spacing(10),
)
.spacing(10)
.padding(10)
.width(Length::Fill)
.height(Length::Fill)
.align_items(Align::Center)
.into()
}
}
fn main() -> iced::Result {
GUI::run(Settings::default())
}
тестовый json-это
{
"task1": {
"deadline": "2000-01-01 00:00:00",
"details": "Folder/Path",
"target":{
"alice": {
"progress": 0,
"comment":"no"
},
"Bob": {
"progress": 1,
"comment":"ok"
}
}
},
"task2": {
"deadline": "2222-01-01 00:00:00",
"details": "Folder/Path",
"target":{
"alice": {
"progress": 0,
"comment":"no"
},
"Carol": {
"progress": 1,
"comment":"ok"
}
}
}
}
Ошибка в том, что
Running `targetdebugprogress_app.exe`
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Error("missing field `Task`", line: 30, column: 3)', srcmain.rs:57:67
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
error: process didn't exit successfully: `targetdebugprogress_app.exe` (exit code: 0xc0000005, STATUS_ACCESS_VIOLATION)
Как я могу получить все цели json, избегая при этом ошибок?
Изменение RUST_BACKTRACE на 1 приведет только к созданию чего-то вроде записи, и ошибка не изменится.
Комментарии:
1. Вы, вероятно, хотите декодировать в
HashMap<String, Task>
2. Формат тестового json не соответствует структуре кода:
task1
иtask2
не может быть сопоставлен с ключом задачи в коде. Если JSON генерируется вашим кодом, я предлагаю изменить его, чтобы добавитьid
файл, а затемtask1
иtask2
может быть объединен с ключомtask