diff --git a/tests/snippets/json_snippet.py b/tests/snippets/json_snippet.py index 42adf8759..24ad1f924 100644 --- a/tests/snippets/json_snippet.py +++ b/tests/snippets/json_snippet.py @@ -44,6 +44,7 @@ assert [['a'], 'b'] == json.loads('[["a"], "b"]') class String(str): pass +assert "string" == json.loads(String('"string"')) assert '"string"' == json.dumps(String("string")) # TODO: Uncomment and test once int/float construction is supported diff --git a/vm/src/stdlib/json.rs b/vm/src/stdlib/json.rs index 1d0140753..c5d51363f 100644 --- a/vm/src/stdlib/json.rs +++ b/vm/src/stdlib/json.rs @@ -211,12 +211,10 @@ fn loads(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult { // TODO: Raise an exception for deserialisation errors let de = PyObjectDeserializer { ctx: &vm.ctx }; // TODO: Support deserializing string sub-classes - Ok(match string.borrow().kind { - PyObjectKind::String { ref value } => de - .deserialize(&mut serde_json::Deserializer::from_str(&value)) - .unwrap(), - _ => unimplemented!("json.loads only handles strings"), - }) + Ok(de + .deserialize(&mut serde_json::Deserializer::from_str(&objstr::get_value( + &string, + ))).unwrap()) } pub fn mk_module(ctx: &PyContext) -> PyObjectRef {