@@ -1951,7 +1951,10 @@ macro_rules! read_primitive {
1951
1951
String ( s) => {
1952
1952
// re: #12967.. a type w/ numeric keys (ie HashMap<uint, V> etc)
1953
1953
// is going to have a string here, as per JSON spec.
1954
- Ok ( std:: from_str:: from_str( s. as_slice( ) ) . unwrap( ) )
1954
+ match std:: from_str:: from_str( s. as_slice( ) ) {
1955
+ Some ( f) => Ok ( f) ,
1956
+ None => Err ( ExpectedError ( "Number" . to_string( ) , s) ) ,
1957
+ }
1955
1958
} ,
1956
1959
value => Err ( ExpectedError ( "Number" . to_string( ) , format!( "{}" , value) ) )
1957
1960
}
@@ -1987,7 +1990,10 @@ impl ::Decoder<DecoderError> for Decoder {
1987
1990
String ( s) => {
1988
1991
// re: #12967.. a type w/ numeric keys (ie HashMap<uint, V> etc)
1989
1992
// is going to have a string here, as per JSON spec.
1990
- Ok ( std:: from_str:: from_str ( s. as_slice ( ) ) . unwrap ( ) )
1993
+ match std:: from_str:: from_str ( s. as_slice ( ) ) {
1994
+ Some ( f) => Ok ( f) ,
1995
+ None => Err ( ExpectedError ( "Number" . to_string ( ) , s) ) ,
1996
+ }
1991
1997
} ,
1992
1998
Null => Ok ( f64:: NAN ) ,
1993
1999
value => Err ( ExpectedError ( "Number" . to_string ( ) , format ! ( "{}" , value) ) )
@@ -3169,6 +3175,7 @@ mod tests {
3169
3175
_ => { } // it parsed and we are good to go
3170
3176
}
3171
3177
}
3178
+
3172
3179
#[ test]
3173
3180
fn test_prettyencode_hashmap_with_numeric_key ( ) {
3174
3181
use std:: str:: from_utf8;
@@ -3189,6 +3196,7 @@ mod tests {
3189
3196
_ => { } // it parsed and we are good to go
3190
3197
}
3191
3198
}
3199
+
3192
3200
#[ test]
3193
3201
fn test_hashmap_with_numeric_key_can_handle_double_quote_delimited_key ( ) {
3194
3202
use std:: collections:: HashMap ;
@@ -3202,6 +3210,20 @@ mod tests {
3202
3210
let _hm: HashMap < uint , bool > = Decodable :: decode ( & mut decoder) . unwrap ( ) ;
3203
3211
}
3204
3212
3213
+ #[ test]
3214
+ fn test_hashmap_with_numeric_key_will_error_with_string_keys ( ) {
3215
+ use std:: collections:: HashMap ;
3216
+ use Decodable ;
3217
+ let json_str = "{\" a\" :true}" ;
3218
+ let json_obj = match from_str ( json_str) {
3219
+ Err ( _) => fail ! ( "Unable to parse json_str: {}" , json_str) ,
3220
+ Ok ( o) => o
3221
+ } ;
3222
+ let mut decoder = Decoder :: new ( json_obj) ;
3223
+ let result: Result < HashMap < uint , bool > , DecoderError > = Decodable :: decode ( & mut decoder) ;
3224
+ assert_eq ! ( result, Err ( ExpectedError ( "Number" . to_string( ) , "a" . to_string( ) ) ) ) ;
3225
+ }
3226
+
3205
3227
fn assert_stream_equal ( src : & str ,
3206
3228
expected : Vec < ( JsonEvent , Vec < StackElement > ) > ) {
3207
3229
let mut parser = Parser :: new ( src. chars ( ) ) ;
0 commit comments