File tree 5 files changed +79
-18
lines changed
5 files changed +79
-18
lines changed Original file line number Diff line number Diff line change @@ -2203,6 +2203,41 @@ where
2203
2203
deserialize_numeric_key ! ( deserialize_f32, deserialize_f32) ;
2204
2204
deserialize_numeric_key ! ( deserialize_f64) ;
2205
2205
2206
+ fn deserialize_bool < V > ( self , visitor : V ) -> Result < V :: Value >
2207
+ where
2208
+ V : de:: Visitor < ' de > ,
2209
+ {
2210
+ self . de . eat_char ( ) ;
2211
+
2212
+ let peek = match tri ! ( self . de. next_char( ) ) {
2213
+ Some ( b) => b,
2214
+ None => {
2215
+ return Err ( self . de . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ;
2216
+ }
2217
+ } ;
2218
+
2219
+ let value = match peek {
2220
+ b't' => {
2221
+ tri ! ( self . de. parse_ident( b"rue\" " ) ) ;
2222
+ visitor. visit_bool ( true )
2223
+ }
2224
+ b'f' => {
2225
+ tri ! ( self . de. parse_ident( b"alse\" " ) ) ;
2226
+ visitor. visit_bool ( false )
2227
+ }
2228
+ _ => {
2229
+ self . de . scratch . clear ( ) ;
2230
+ let s = tri ! ( self . de. read. parse_str( & mut self . de. scratch) ) ;
2231
+ Err ( de:: Error :: invalid_type ( Unexpected :: Str ( & s) , & visitor) )
2232
+ }
2233
+ } ;
2234
+
2235
+ match value {
2236
+ Ok ( value) => Ok ( value) ,
2237
+ Err ( err) => Err ( self . de . fix_position ( err) ) ,
2238
+ }
2239
+ }
2240
+
2206
2241
#[ inline]
2207
2242
fn deserialize_option < V > ( self , visitor : V ) -> Result < V :: Value >
2208
2243
where
@@ -2258,7 +2293,7 @@ where
2258
2293
}
2259
2294
2260
2295
forward_to_deserialize_any ! {
2261
- bool char str string unit unit_struct seq tuple tuple_struct map struct
2296
+ char str string unit unit_struct seq tuple tuple_struct map struct
2262
2297
identifier ignored_any
2263
2298
}
2264
2299
}
Original file line number Diff line number Diff line change @@ -827,8 +827,21 @@ where
827
827
type SerializeStruct = Impossible < ( ) , Error > ;
828
828
type SerializeStructVariant = Impossible < ( ) , Error > ;
829
829
830
- fn serialize_bool ( self , _value : bool ) -> Result < ( ) > {
831
- Err ( key_must_be_a_string ( ) )
830
+ fn serialize_bool ( self , value : bool ) -> Result < ( ) > {
831
+ tri ! ( self
832
+ . ser
833
+ . formatter
834
+ . begin_string( & mut self . ser. writer)
835
+ . map_err( Error :: io) ) ;
836
+ tri ! ( self
837
+ . ser
838
+ . formatter
839
+ . write_bool( & mut self . ser. writer, value)
840
+ . map_err( Error :: io) ) ;
841
+ self . ser
842
+ . formatter
843
+ . end_string ( & mut self . ser . writer )
844
+ . map_err ( Error :: io)
832
845
}
833
846
834
847
fn serialize_i8 ( self , value : i8 ) -> Result < ( ) > {
Original file line number Diff line number Diff line change @@ -1183,6 +1183,22 @@ impl<'de> serde::Deserializer<'de> for MapKeyDeserializer<'de> {
1183
1183
deserialize_numeric_key ! ( deserialize_i128, do_deserialize_i128) ;
1184
1184
deserialize_numeric_key ! ( deserialize_u128, do_deserialize_u128) ;
1185
1185
1186
+ fn deserialize_bool < V > ( self , visitor : V ) -> Result < V :: Value , Error >
1187
+ where
1188
+ V : Visitor < ' de > ,
1189
+ {
1190
+ if self . key == "true" {
1191
+ visitor. visit_bool ( true )
1192
+ } else if self . key == "false" {
1193
+ visitor. visit_bool ( false )
1194
+ } else {
1195
+ Err ( serde:: de:: Error :: invalid_type (
1196
+ Unexpected :: Str ( & self . key ) ,
1197
+ & visitor,
1198
+ ) )
1199
+ }
1200
+ }
1201
+
1186
1202
#[ inline]
1187
1203
fn deserialize_option < V > ( self , visitor : V ) -> Result < V :: Value , Error >
1188
1204
where
@@ -1219,8 +1235,8 @@ impl<'de> serde::Deserializer<'de> for MapKeyDeserializer<'de> {
1219
1235
}
1220
1236
1221
1237
forward_to_deserialize_any ! {
1222
- bool char str string bytes byte_buf unit unit_struct seq tuple
1223
- tuple_struct map struct identifier ignored_any
1238
+ char str string bytes byte_buf unit unit_struct seq tuple tuple_struct
1239
+ map struct identifier ignored_any
1224
1240
}
1225
1241
}
1226
1242
Original file line number Diff line number Diff line change @@ -483,8 +483,8 @@ impl serde::Serializer for MapKeySerializer {
483
483
value. serialize ( self )
484
484
}
485
485
486
- fn serialize_bool ( self , _value : bool ) -> Result < String > {
487
- Err ( key_must_be_a_string ( ) )
486
+ fn serialize_bool ( self , value : bool ) -> Result < String > {
487
+ Ok ( value . to_string ( ) )
488
488
}
489
489
490
490
fn serialize_i8 ( self , value : i8 ) -> Result < String > {
Original file line number Diff line number Diff line change @@ -1654,17 +1654,6 @@ fn test_deserialize_from_stream() {
1654
1654
assert_eq ! ( request, response) ;
1655
1655
}
1656
1656
1657
- #[ test]
1658
- fn test_serialize_rejects_bool_keys ( ) {
1659
- let map = treemap ! (
1660
- true => 2 ,
1661
- false => 4 ,
1662
- ) ;
1663
-
1664
- let err = to_vec ( & map) . unwrap_err ( ) ;
1665
- assert_eq ! ( err. to_string( ) , "key must be a string" ) ;
1666
- }
1667
-
1668
1657
#[ test]
1669
1658
fn test_serialize_rejects_adt_keys ( ) {
1670
1659
let map = treemap ! (
@@ -2018,6 +2007,14 @@ fn test_deny_non_finite_f64_key() {
2018
2007
assert ! ( serde_json:: to_value( map) . is_err( ) ) ;
2019
2008
}
2020
2009
2010
+ #[ test]
2011
+ fn test_boolean_key ( ) {
2012
+ let map = treemap ! ( false => 0 , true => 1 ) ;
2013
+ let j = r#"{"false":0,"true":1}"# ;
2014
+ test_encode_ok ( & [ ( & map, j) ] ) ;
2015
+ test_parse_ok ( vec ! [ ( j, map) ] ) ;
2016
+ }
2017
+
2021
2018
#[ test]
2022
2019
fn test_borrowed_key ( ) {
2023
2020
let map: BTreeMap < & str , ( ) > = from_str ( "{\" borrowed\" :null}" ) . unwrap ( ) ;
You can’t perform that action at this time.
0 commit comments