Problem deserializing maps when deserialization target expect owned String keys
Closed this issue · 2 comments
I just encountered this somewhat strange behavior. Trying to deserialize a very simple RON string into a serde_json::Value
fails with an ExpectedIdentifier
error:
let json: serde_json::Value = ron::from_str("(f1: 0, f2: 1)").unwrap();
I know that RON is not meant to be a self describing format and supports more types than JSON, but I expected this simple structure to be deserialized correctly; the identifiers should support deserializing to string keys.
The trigger of the error is that the serde_json::Value
type expect owned String
keys. After some investigating, it seems that the problem is related to the id::Deserializer
variant, which supports deserialize_str(..)
, but NOT deserialize_string(..)
, which I find somewhat inconsistent. These methods should give the same result; the reason for having two methods is to give hints about expected string ownership (for performance reasons).
The following patch in de/id.rs
file makes the code example work as expected:
// de::id.rs, line 147:
fn deserialize_string<V>(self, visitor: V) -> Result<V::Value>
where
V: Visitor<'b>,
{
// Err(Error::ExpectedIdentifier)
self.deserialize_identifier(visitor) // Same as deserialize_str behavior
}
Thank you @grindvoll for reporting and investigating this issue! This sounds like an easy-enough change to me. Would you like to file a PR yourself that also adds a test with your usecase? I'm unfortunately quite swamped with uni at the moment.
Ok, I will try to file a PR with unit test as soon as possible.