//! };
//!
//! // Serialize using `json::encode`
-//! let encoded = json::encode(&object);
+//! let encoded = json::encode(&object).unwrap();
//!
//! // Deserialize using `json::decode`
//! let decoded: TestStruct = json::decode(encoded.as_slice()).unwrap();
//! uid: 1,
//! dsc: "test".to_string(),
//! val: num.to_json(),
-//! });
+//! }).unwrap();
//! println!("data: {}", data);
//! // data: {"uid":1,"dsc":"test","val":"0.0001+12.539j"};
//! }
}
/// Shortcut function to encode a `T` into a JSON `String`
-pub fn encode<T: ::Encodable>(object: &T) -> string::String {
+pub fn encode<T: ::Encodable>(object: &T) -> Result<string::String, EncoderError> {
let mut s = String::new();
{
let mut encoder = Encoder::new(&mut s);
- let _ = object.encode(&mut encoder);
+ try!(object.encode(&mut encoder));
}
- s
+ Ok(s)
}
impl fmt::Display for ErrorCode {
fn emit_enum<F>(&mut self, _name: &str, f: F) -> EncodeResult where
F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
{
- if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
f(self)
}
// enums are encoded as strings or objects
// Bunny => "Bunny"
// Kangaroo(34,"William") => {"variant": "Kangaroo", "fields": [34,"William"]}
- if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
if cnt == 0 {
escape_str(self.writer, name)
} else {
+ if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
try!(write!(self.writer, "{{\"variant\":"));
try!(escape_str(self.writer, name));
try!(write!(self.writer, ",\"fields\":["));
fn emit_enum<F>(&mut self, _name: &str, f: F) -> EncodeResult where
F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
{
- if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
f(self)
}
-> EncodeResult where
F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
{
- if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
if cnt == 0 {
escape_str(self.writer, name)
} else {
+ if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
try!(write!(self.writer, "{{\n"));
self.curr_indent += self.indent;
try!(spaces(self.writer, self.curr_indent));
}
}
+ #[test]
+ fn test_hashmap_with_enum_key() {
+ use std::collections::HashMap;
+ use json;
+ #[derive(RustcEncodable, Eq, Hash, PartialEq, RustcDecodable, Show)]
+ enum Enum {
+ Foo,
+ #[allow(dead_code)]
+ Bar,
+ }
+ let mut map = HashMap::new();
+ map.insert(Enum::Foo, 0);
+ let result = json::encode(&map).unwrap();
+ assert_eq!(&result[], r#"{"Foo":0}"#);
+ let decoded: HashMap<Enum, _> = json::decode(result.as_slice()).unwrap();
+ assert_eq!(map, decoded);
+ }
+
#[test]
fn test_hashmap_with_numeric_key_can_handle_double_quote_delimited_key() {
use std::collections::HashMap;