Skip to content

Commit 54ffc69

Browse files
committed
Dict key must be str
1 parent 227e08d commit 54ffc69

2 files changed

Lines changed: 17 additions & 5 deletions

File tree

src/encode.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,12 +82,15 @@ impl<'p, 'a> Serialize for SerializePyObject<'p, 'a> {
8282
if len != 0 {
8383
let mut map = serializer.serialize_map(Some(len))?;
8484
for (key, value) in val.iter() {
85+
if key.get_type_ptr() != self.refs.str {
86+
return Err(ser::Error::custom(format_args!(
87+
"Dict key must be str, not: {:?}",
88+
key
89+
)));
90+
}
91+
let keystr: &PyUnicode = key.extract().unwrap();
8592
map.serialize_entry(
86-
&SerializePyObject {
87-
py: self.py,
88-
refs: self.refs,
89-
obj: key,
90-
},
93+
unsafe { std::str::from_utf8_unchecked(keystr.as_bytes()) },
9194
&SerializePyObject {
9295
py: self.py,
9396
refs: self.refs,

test/test_type.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,3 +124,12 @@ def test_dict_large(self):
124124
obj = {'key_%s' % idx: 'value' for idx in range(513)}
125125
self.assertEqual(len(obj), 513)
126126
self.assertEqual(orjson.loads(orjson.dumps(obj)), obj)
127+
128+
def test_dict_invalid_key(self):
129+
"""
130+
dict invalid key
131+
"""
132+
with self.assertRaises(TypeError):
133+
orjson.dumps({1: 'value'})
134+
with self.assertRaises(TypeError):
135+
orjson.dumps({b'key': 'value'})

0 commit comments

Comments
 (0)