2015-09-01 62 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以刪除這些界限,並被接受!^_ ^我想這意味着界限最初可能只是一個錯字。

相關問題