Skip to content

Problem deserializing maps when deserialization target expect owned String keys #511

@grindvoll

Description

@grindvoll

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
    }

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions