@@ -135,18 +135,21 @@ impl serialize::Encoder for Encoder {
135
135
_id : uint ,
136
136
cnt : uint ,
137
137
f : & fn ( & mut Encoder ) ) {
138
- // enums are encoded as strings or vectors:
138
+ // enums are encoded as strings or objects
139
139
// Bunny => "Bunny"
140
- // Kangaroo(34,"William") => ["Kangaroo",[34,"William"]]
141
-
140
+ // Kangaroo(34,"William") => {"variant": "Kangaroo", "fields": [34,"William"]}
142
141
if cnt == 0 {
143
142
self . wr . write_str ( escape_str ( name) ) ;
144
143
} else {
145
- self . wr . write_char ( '[' ) ;
144
+ self . wr . write_char ( '{' ) ;
145
+ self . wr . write_str ( "\" variant\" " ) ;
146
+ self . wr . write_char ( ':' ) ;
146
147
self . wr . write_str ( escape_str ( name) ) ;
147
148
self . wr . write_char ( ',' ) ;
149
+ self . wr . write_str ( "\" fields\" " ) ;
150
+ self . wr . write_str ( ":[" ) ;
148
151
f ( self ) ;
149
- self . wr . write_char ( ']' ) ;
152
+ self . wr . write_str ( "]}" ) ;
150
153
}
151
154
}
152
155
@@ -947,14 +950,20 @@ impl serialize::Decoder for Decoder {
947
950
debug ! ( "read_enum_variant(names=%?)" , names) ;
948
951
let name = match self . stack . pop ( ) {
949
952
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" )
957
965
}
966
+ n
958
967
}
959
968
ref json => fail ! ( "invalid variant: %?" , * json) ,
960
969
} ;
@@ -1517,7 +1526,7 @@ mod tests {
1517
1526
let mut encoder = Encoder(wr);
1518
1527
animal.encode(&mut encoder);
1519
1528
},
1520
- ~" [ \" Frog \" , \" Henry \" , 349 ] "
1529
+ ~" { \" variant \" : \" Frog \" , \" fields \" : [ \" Henry \" , 349 ] } "
1521
1530
);
1522
1531
assert_eq!(
1523
1532
do io::with_str_writer |wr| {
@@ -1921,14 +1930,14 @@ mod tests {
1921
1930
assert_eq!( value, Dog ) ;
1922
1931
1923
1932
let mut decoder =
1924
- Decoder ( from_str( "[ \" Frog\" ,\" Henry\" ,349]" ) . unwrap( ) ) ;
1933
+ Decoder ( from_str( "{ \" variant \" : \" Frog\" ,\" fields \" :[ \" Henry\" ,349]} " ) . unwrap( ) ) ;
1925
1934
let value: Animal = Decodable :: decode( & mut decoder) ;
1926
1935
assert_eq!( value, Frog ( ~"Henry ", 349));
1927
1936
}
1928
1937
1929
1938
#[test]
1930
1939
fn test_decode_map() {
1931
- let s = ~" { \" a\" : \"Dog \" , \"b\" : [ \" Frog \" , \" Henry \" , 349 ] } ";
1940
+ let s = ~" { \" a\" : \"Dog \" , \"b\" : { \" variant \" : \" Frog \" , \" fields \" : [ \" Henry \" , 349 ] } } ";
1932
1941
let mut decoder = Decoder(from_str(s).unwrap());
1933
1942
let mut map: TreeMap<~str, Animal> = Decodable::decode(&mut decoder);
1934
1943
0 commit comments