2015-09-01 41 views
4

我有一个包含带有未知键的JSON对象的文件。我想将这个对象解码成一个结构,但不知道如何声明这个结构。发生使用rustc_serialize反序列化JSON对象:为什么需要实现PartialEq?

extern crate rustc_serialize; 
use rustc_serialize::json; 
use std::collections::BTreeMap; 

#[derive(RustcDecodable, Debug)] 
struct MyStruct { 
    foo: u8, 
    bar: Vec<String>, 
} 

let raw_json = r#"{ 
    "A": { 
     "foo": 2, 
     "bar": ["a", "b"], 
    }, 
    "C": { 
     "foo": 1, 
     "bar": ["c", "d"], 
    }, 
    : 
}"#; 

let j: BTreeMap<String, MyStruct> = json::decode(&raw_json).unwrap(); 
println!("{:?}", j.get("A").unwrap()); 

以下错误:

error: the trait `core::cmp::PartialEq` is not implemented for the type `MyStruct` [E0277] 
    let j: BTreeMap<String, MyStruct> = json::decode(&raw_json).unwrap(); 
             ^~~~~~~~~~~~ 

我将不得不实施DecodableMyStruct自己呢?

+0

您是否试图按错误消息的建议实施PartialEq? – Shepmaster

+0

不,tbh。我认为这个错误是不正确的,因为这个结构等式应该可能派生。我现在实施了'PartialEq',它工作。但是,我仍然不明白为什么我需要这样做。网上的例子似乎都没有做到这一点。 – Kreisquadratur

+0

*对于这个结构相等应该可能派生* - 没有特征会自动派生,这就是为什么你必须添加'#[derive]'。 – Shepmaster

回答

0

作为暗示由@Shepmaster简单的答案是要么执行PartialEq性状或让它得到,作为错误消息指示:

#[derive(RustcDecodable, PartialEq, Debug)] 
+0

问题不是'我该如何解决这个问题',而是'为什么我需要它。 –

+0

(至少,这是我的看法) –

+0

@SteveKlabnik请注意,您正在回答问题的OP^_^ – Shepmaster

3

json::decode定义为:

pub fn decode<T: Decodable>(s: &str) -> DecodeResult<T> 

这意味着给定一个字符串片段,它将尝试将其解码为用户指定的类型,只要该类型实现了Decodable即可。在为Decodable的页面,你可以看到这一切的实现,包括一个为BTreeMap

impl<K: Decodable + PartialEq + Ord, 
    V: Decodable + PartialEq> 
Decodable for BTreeMap<K, V> 

这表明为了解码为BTreeMap,无论是键和值在地图需PartialEq。但是,我并不清楚为什么实际需要。 BTreeMap应该只需要密钥为Ord而不关心数值。为此,我打开了a pull request以删除这些界限,并被接受!^_ ^我想这意味着界限最初可能只是一个错字。

相关问题