@@ -135,18 +135,21 @@ impl serialize::Encoder for Encoder {
135135 _id : uint ,
136136 cnt : uint ,
137137 f : & fn ( & mut Encoder ) ) {
138- // enums are encoded as strings or vectors:
138+ // enums are encoded as strings or objects
139139 // Bunny => "Bunny"
140- // Kangaroo(34,"William") => ["Kangaroo",[34,"William"]]
141-
140+ // Kangaroo(34,"William") => {"variant": "Kangaroo", "fields": [34,"William"]}
142141 if cnt == 0 {
143142 self . wr . write_str ( escape_str ( name) ) ;
144143 } else {
145- self . wr . write_char ( '[' ) ;
144+ self . wr . write_char ( '{' ) ;
145+ self . wr . write_str ( "\" variant\" " ) ;
146+ self . wr . write_char ( ':' ) ;
146147 self . wr . write_str ( escape_str ( name) ) ;
147148 self . wr . write_char ( ',' ) ;
149+ self . wr . write_str ( "\" fields\" " ) ;
150+ self . wr . write_str ( ":[" ) ;
148151 f ( self ) ;
149- self . wr . write_char ( ']' ) ;
152+ self . wr . write_str ( "]}" ) ;
150153 }
151154 }
152155
@@ -947,14 +950,20 @@ impl serialize::Decoder for Decoder {
947950 debug ! ( "read_enum_variant(names=%?)" , names) ;
948951 let name = match self . stack . pop ( ) {
949952 String ( s) => s,
950- List ( list) => {
951- for v in list. move_rev_iter ( ) {
952- self . stack . push ( v) ;
953- }
954- match self . stack . pop ( ) {
955- String ( s) => s,
956- value => fail ! ( "invalid variant name: %?" , value) ,
953+ Object ( o) => {
954+ let n = match o. find ( & ~"variant") . expect ( "invalidly encoded json" ) {
955+ & String ( ref s) => s. clone ( ) ,
956+ _ => fail ! ( "invalidly encoded json" ) ,
957+ } ;
958+ match o. find ( & ~"fields") . expect ( "invalidly encoded json" ) {
959+ & List ( ref l) => {
960+ for field in l. rev_iter ( ) {
961+ self . stack . push ( field. clone ( ) ) ;
962+ }
963+ } ,
964+ _ => fail ! ( "invalidly encoded json" )
957965 }
966+ n
958967 }
959968 ref json => fail ! ( "invalid variant: %?" , * json) ,
960969 } ;
@@ -1517,7 +1526,7 @@ mod tests {
15171526 let mut encoder = Encoder(wr);
15181527 animal.encode(&mut encoder);
15191528 },
1520- ~" [ \" Frog \" , \" Henry \" , 349 ] "
1529+ ~" { \" variant \" : \" Frog \" , \" fields \" : [ \" Henry \" , 349 ] } "
15211530 );
15221531 assert_eq!(
15231532 do io::with_str_writer |wr| {
@@ -1921,14 +1930,14 @@ mod tests {
19211930 assert_eq!( value, Dog ) ;
19221931
19231932 let mut decoder =
1924- Decoder ( from_str( "[ \" Frog\" ,\" Henry\" ,349]" ) . unwrap( ) ) ;
1933+ Decoder ( from_str( "{ \" variant \" : \" Frog\" ,\" fields \" :[ \" Henry\" ,349]} " ) . unwrap( ) ) ;
19251934 let value: Animal = Decodable :: decode( & mut decoder) ;
19261935 assert_eq!( value, Frog ( ~"Henry ", 349));
19271936 }
19281937
19291938 #[test]
19301939 fn test_decode_map() {
1931- let s = ~" { \" a\" : \"Dog \" , \"b\" : [ \" Frog \" , \" Henry \" , 349 ] } ";
1940+ let s = ~" { \" a\" : \"Dog \" , \"b\" : { \" variant \" : \" Frog \" , \" fields \" : [ \" Henry \" , 349 ] } } ";
19321941 let mut decoder = Decoder(from_str(s).unwrap());
19331942 let mut map: TreeMap<~str, Animal> = Decodable::decode(&mut decoder);
19341943
0 commit comments