Tôi đang cố gắng hủy bỏ cấu trúc JSON thành Rust bằng cách sử dụng rustc_serialize. Vấn đề là một số JSON nhất định có một số trường tùy chọn, tức là, có thể có hoặc không có mặt. Thời điểm trường đầu tiên vắng mặt gặp phải, bộ giải mã dường như được bảo lãnh và không xem xét các trường tiếp theo, ngay cả khi chúng có mặt. Có cách nào để vượt qua điều này không?Không thể xử lý các trường tùy chọn trong JSON với mã hóa tuần tự
Đây là mã:
extern crate rustc_serialize;
#[derive(Debug)]
struct B {
some_field_0: Option<u64>,
some_field_1: Option<String>,
}
impl rustc_serialize::Decodable for B {
fn decode<D: rustc_serialize::Decoder>(d: &mut D) -> Result<Self, D::Error> {
Ok(B {
some_field_0: d.read_struct_field("some_field_0", 0, |d| rustc_serialize::Decodable::decode(d)).ok(),
some_field_1: d.read_struct_field("some_field_1", 0, |d| rustc_serialize::Decodable::decode(d)).ok(),
})
}
}
fn main() {
{
println!("--------------------------------\n1st run - all field present\n--------------------------------");
let json_str = "{\"some_field_0\": 1234, \"some_field_1\": \"There\"}".to_string();
let obj_b: B = rustc_serialize::json::decode(&json_str).unwrap();
println!("\nJSON: {}\nDecoded: {:?}", json_str, obj_b);
}
{
println!("\n\n--------------------------------\n2nd run - \"some_field_1\" absent\n---------------------------------");
let json_str = "{\"some_field_0\": 1234}".to_string();
let obj_b: B = rustc_serialize::json::decode(&json_str).unwrap();
println!("\nJSON: {}\nDecoded: {:?}", json_str, obj_b);
}
{
println!("\n\n--------------------------------\n3rd run - \"some_field_0\" absent\n---------------------------------");
let json_str = "{\"some_field_1\": \"There\"}".to_string();
let obj_b: B = rustc_serialize::json::decode(&json_str).unwrap();
println!("\nJSON: {}\nDecoded: {:?}", json_str, obj_b);
}
}
và đây là kết quả:
--------------------------------
1st run - all field present
--------------------------------
JSON: {"some_field_0": 1234, "some_field_1": "There"}
Decoded: B { some_field_0: Some(1234), some_field_1: Some("There") }
--------------------------------
2nd run - "some_field_1" absent
---------------------------------
JSON: {"some_field_0": 1234}
Decoded: B { some_field_0: Some(1234), some_field_1: None }
--------------------------------
3rd run - "some_field_0" absent
---------------------------------
JSON: {"some_field_1": "There"}
Decoded: B { some_field_0: None, some_field_1: None }
ý rằng thời gian thứ ba tạo ra một kết quả bất ngờ. Khi bộ giải mã không tìm thấy some_field_0
nó không thành công trên tất cả các mã thông báo tiếp theo, mặc dù some_field_1
có mặt.
Có vẻ như một lỗi trong tuần tự hóa. Xem xét việc gửi một vấn đề trên [github] (https://github.com/rust-lang-nursery/rustc-serialize) – aochagavia