diff --git a/bson/json_util.py b/bson/json_util.py index 0644874b44..ed67d9a36c 100644 --- a/bson/json_util.py +++ b/bson/json_util.py @@ -508,7 +508,7 @@ def object_hook(dct, json_options=DEFAULT_JSON_OPTIONS): def _parse_legacy_regex(doc): pattern = doc["$regex"] # Check if this is the $regex query operator. - if isinstance(pattern, Regex): + if not isinstance(pattern, (str, bytes)): return doc flags = 0 # PyMongo always adds $options but some other tools may not. diff --git a/test/test_json_util.py b/test/test_json_util.py index f28b75c9be..dbf4f1c26a 100644 --- a/test/test_json_util.py +++ b/test/test_json_util.py @@ -270,6 +270,15 @@ def test_regex(self): json_util.dumps(Regex('.*', re.M | re.X), json_options=LEGACY_JSON_OPTIONS)) + def test_regex_validation(self): + non_str_types = [10, {}, []] + docs = [{"$regex": i} for i in non_str_types] + for doc in docs: + self.assertEqual(doc, json_util.loads(json.dumps(doc))) + + doc = {"$regex": ""} + self.assertIsInstance(json_util.loads(json.dumps(doc)), Regex) + def test_minkey(self): self.round_trip({"m": MinKey()})