97
97
//! };
98
98
//!
99
99
//! // Serialize using `json::encode`
100
- //! let encoded = json::encode(&object);
100
+ //! let encoded = json::encode(&object).unwrap() ;
101
101
//!
102
102
//! // Deserialize using `json::decode`
103
103
//! let decoded: TestStruct = json::decode(encoded.as_slice()).unwrap();
143
143
//! uid: 1,
144
144
//! dsc: "test".to_string(),
145
145
//! val: num.to_json(),
146
- //! });
146
+ //! }).unwrap() ;
147
147
//! println!("data: {}", data);
148
148
//! // data: {"uid":1,"dsc":"test","val":"0.0001+12.539j"};
149
149
//! }
@@ -316,13 +316,13 @@ pub fn decode<T: ::Decodable>(s: &str) -> DecodeResult<T> {
316
316
}
317
317
318
318
/// Shortcut function to encode a `T` into a JSON `String`
319
- pub fn encode < T : :: Encodable > ( object : & T ) -> string:: String {
319
+ pub fn encode < T : :: Encodable > ( object : & T ) -> Result < string:: String , EncoderError > {
320
320
let mut s = String :: new ( ) ;
321
321
{
322
322
let mut encoder = Encoder :: new ( & mut s) ;
323
- let _ = object. encode ( & mut encoder) ;
323
+ try! ( object. encode ( & mut encoder) ) ;
324
324
}
325
- s
325
+ Ok ( s )
326
326
}
327
327
328
328
impl fmt:: Display for ErrorCode {
@@ -536,7 +536,6 @@ impl<'a> ::Encoder for Encoder<'a> {
536
536
fn emit_enum < F > ( & mut self , _name : & str , f : F ) -> EncodeResult where
537
537
F : FnOnce ( & mut Encoder < ' a > ) -> EncodeResult ,
538
538
{
539
- if self . is_emitting_map_key { return Err ( EncoderError :: BadHashmapKey ) ; }
540
539
f ( self )
541
540
}
542
541
@@ -550,10 +549,10 @@ impl<'a> ::Encoder for Encoder<'a> {
550
549
// enums are encoded as strings or objects
551
550
// Bunny => "Bunny"
552
551
// Kangaroo(34,"William") => {"variant": "Kangaroo", "fields": [34,"William"]}
553
- if self . is_emitting_map_key { return Err ( EncoderError :: BadHashmapKey ) ; }
554
552
if cnt == 0 {
555
553
escape_str ( self . writer , name)
556
554
} else {
555
+ if self . is_emitting_map_key { return Err ( EncoderError :: BadHashmapKey ) ; }
557
556
try!( write ! ( self . writer, "{{\" variant\" :" ) ) ;
558
557
try!( escape_str ( self . writer , name) ) ;
559
558
try!( write ! ( self . writer, ",\" fields\" :[" ) ) ;
@@ -785,7 +784,6 @@ impl<'a> ::Encoder for PrettyEncoder<'a> {
785
784
fn emit_enum < F > ( & mut self , _name : & str , f : F ) -> EncodeResult where
786
785
F : FnOnce ( & mut PrettyEncoder < ' a > ) -> EncodeResult ,
787
786
{
788
- if self . is_emitting_map_key { return Err ( EncoderError :: BadHashmapKey ) ; }
789
787
f ( self )
790
788
}
791
789
@@ -797,10 +795,10 @@ impl<'a> ::Encoder for PrettyEncoder<'a> {
797
795
-> EncodeResult where
798
796
F : FnOnce ( & mut PrettyEncoder < ' a > ) -> EncodeResult ,
799
797
{
800
- if self . is_emitting_map_key { return Err ( EncoderError :: BadHashmapKey ) ; }
801
798
if cnt == 0 {
802
799
escape_str ( self . writer , name)
803
800
} else {
801
+ if self . is_emitting_map_key { return Err ( EncoderError :: BadHashmapKey ) ; }
804
802
try!( write ! ( self . writer, "{{\n " ) ) ;
805
803
self . curr_indent += self . indent ;
806
804
try!( spaces ( self . writer , self . curr_indent ) ) ;
@@ -3537,6 +3535,24 @@ mod tests {
3537
3535
}
3538
3536
}
3539
3537
3538
+ #[ test]
3539
+ fn test_hashmap_with_enum_key ( ) {
3540
+ use std:: collections:: HashMap ;
3541
+ use json;
3542
+ #[ derive( RustcEncodable , Eq , Hash , PartialEq , RustcDecodable , Show ) ]
3543
+ enum Enum {
3544
+ Foo ,
3545
+ #[ allow( dead_code) ]
3546
+ Bar ,
3547
+ }
3548
+ let mut map = HashMap :: new ( ) ;
3549
+ map. insert ( Enum :: Foo , 0 ) ;
3550
+ let result = json:: encode ( & map) . unwrap ( ) ;
3551
+ assert_eq ! ( & result[ ] , r#"{"Foo":0}"# ) ;
3552
+ let decoded: HashMap < Enum , _ > = json:: decode ( result. as_slice ( ) ) . unwrap ( ) ;
3553
+ assert_eq ! ( map, decoded) ;
3554
+ }
3555
+
3540
3556
#[ test]
3541
3557
fn test_hashmap_with_numeric_key_can_handle_double_quote_delimited_key ( ) {
3542
3558
use std:: collections:: HashMap ;
0 commit comments