File tree Expand file tree Collapse file tree 2 files changed +28
-8
lines changed Expand file tree Collapse file tree 2 files changed +28
-8
lines changed Original file line number Diff line number Diff line change @@ -30,14 +30,19 @@ impl<'de> Deserialize<'de> for ObjectId {
30
30
where
31
31
D : de:: Deserializer < ' de > ,
32
32
{
33
- deserializer. deserialize_map ( BsonVisitor ) . and_then ( |bson| {
34
- if let Bson :: ObjectId ( oid) = bson {
35
- Ok ( oid)
36
- } else {
37
- let err = format ! ( "expected objectId extended document, found {}" , bson) ;
38
- Err ( de:: Error :: invalid_type ( Unexpected :: Map , & & err[ ..] ) )
39
- }
40
- } )
33
+ deserializer
34
+ . deserialize_any ( BsonVisitor )
35
+ . and_then ( |bson| match bson {
36
+ Bson :: String ( oid) => ObjectId :: with_string ( & oid) . map_err ( de:: Error :: custom) ,
37
+ Bson :: ObjectId ( oid) => Ok ( oid) ,
38
+ _ => {
39
+ let err = format ! (
40
+ "expected objectId extended document or hex string, found {}" ,
41
+ bson
42
+ ) ;
43
+ Err ( de:: Error :: invalid_type ( Unexpected :: Map , & & err[ ..] ) )
44
+ }
45
+ } )
41
46
}
42
47
}
43
48
Original file line number Diff line number Diff line change @@ -5,6 +5,7 @@ use crate::{
5
5
compat:: u2f,
6
6
doc,
7
7
from_bson,
8
+ oid:: ObjectId ,
8
9
spec:: BinarySubtype ,
9
10
tests:: LOCK ,
10
11
to_bson,
@@ -558,3 +559,17 @@ fn test_de_db_pointer() {
558
559
559
560
assert_eq ! ( foo. db_pointer, db_pointer. clone( ) ) ;
560
561
}
562
+
563
+ #[ test]
564
+ fn test_de_oid_string ( ) {
565
+ let _guard = LOCK . run_concurrently ( ) ;
566
+
567
+ #[ derive( Debug , Deserialize ) ]
568
+ struct Foo {
569
+ pub oid : ObjectId ,
570
+ }
571
+
572
+ let foo: Foo = serde_json:: from_str ( "{ \" oid\" : \" 507f1f77bcf86cd799439011\" }" ) . unwrap ( ) ;
573
+ let oid = ObjectId :: with_string ( "507f1f77bcf86cd799439011" ) . unwrap ( ) ;
574
+ assert_eq ! ( foo. oid, oid) ;
575
+ }
You can’t perform that action at this time.
0 commit comments