Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用不规则内容反序列化JSON_Json_Rust - Fatal编程技术网

使用不规则内容反序列化JSON

使用不规则内容反序列化JSON,json,rust,Json,Rust,我举了下面的例子,其中可能会发生两件“不寻常”的事情: 如果状态为NOK,则根本不包括数据元素 列表中元素的某些属性可能丢失(在下面的示例中,列表的第二个元素中缺少key2) 有没有一种方法可以使用自动派生来反序列化不规则的JSON字符串? 在Rust中处理这种不规则JSON的最简单/更好的方法是什么?我可以避免编写一个非常复杂的匹配代码来检查所有可能的组合吗 extern crate serialize; static JSON: &'static str = r#"

我举了下面的例子,其中可能会发生两件“不寻常”的事情:

  • 如果状态为
    NOK
    ,则根本不包括
    数据
    元素
  • 列表
    中元素的某些属性可能丢失(在下面的示例中,
    列表
    的第二个元素中缺少
    key2
有没有一种方法可以使用自动派生来反序列化不规则的JSON字符串? 在Rust中处理这种不规则JSON的最简单/更好的方法是什么?我可以避免编写一个非常复杂的
匹配
代码来检查所有可能的组合吗

extern crate serialize;

static JSON: &'static str  = r#"
    {
        "status": {
            "status": "OK"
        },
        "data": {
            "container": {
                "key": "value",
                "list": [
                    {
                        "key1": "value1",
                        "key2": "value2"
                    },
                    {
                        "key1": "value1"
                    }
                ]
            }
        }
    }"#;
#[deriving(Decodable, Show)]
struct Top {
    status: Status,
    data: Data,
}

#[deriving(Decodable, Show)]
struct Data {
    container: Container,
}

#[deriving(Decodable, Show)]
struct Status {
    status: String,
}

#[deriving(Decodable, Show)]
struct Container {
    key: String,
    list: Vec<KeyVals>,
}

#[deriving(Decodable, Show)]
struct KeyVals {
    key1: String,
    key2: String,
}

fn main() {
    let result: Top = match serialize::json::decode(JSON) {
        Ok(x) => x,
        Err(why) => fail!("Failed decoding the JSON! Reason: {}", why),
    };
    println!("{}", result);
}

谢谢

潜在的现有数据可以通过枚举表示。在最简单的情况下,使用
选项

我相信使用枚举也会解决您的问题

#[deriving(Encodable, Decodable)]
enum Status {
    Good(Container),
    Bad,
    VeryBad
}

如果容器还包含潜在的现有数据,那么您可以再次使用枚举来表示该数据。

我认为由于以下原因,
选项目前无法工作:
。如果您阅读了该问题,它确实提供了一些(痛苦的)解决方法。@oschwald提到的问题已经解决,因此现在可以使用
选项
来表示可选字段。谢谢大家。
#[deriving(Encodable, Decodable)]
enum Status {
    Good(Container),
    Bad,
    VeryBad
}