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
}
I just encountered this somewhat strange behavior. Trying to deserialize a very simple RON string into a
serde_json::Valuefails with anExpectedIdentifiererror: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::Valuetype expect ownedStringkeys. After some investigating, it seems that the problem is related to theid::Deserializervariant, which supportsdeserialize_str(..), but NOTdeserialize_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.rsfile makes the code example work as expected: