cargo serde_json 1.0.8

latest releases: 1.0.120, 1.0.119, 1.0.118...
6 years ago

Compatibility notes

Part of the improvement to compile time comes from having generic methods in serde_json instantiate many fewer Visitor trait methods than they used to. For example if a Deserialize impl is being deserialized from JSON and the impl indicates to Serde that the type u64 is expected, serde_json can avoid instantiating all of the Visitor methods that deal with string, borrowed string, unit, sequence, map, boolean, char, bytes, borrowed bytes, option, newtype, and enum. Previously all of these methods were instantiated and compile times were predictably poor in consequence. As of this release, serde_json instantiates only the expected Visitor methods and instead renders invalid_type error messages in a central place in the Deserializer that can be instantiated just once. This does not apply to deserialize_any for which it continues to be necessary to instantiate every Visitor method.

This does mean that code relying on the deserialize hint to be wrong may no longer deserialize successfully.

impl<'de> Deserialize<'de> for MyType {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
        where D: Deserializer<'de>
    {
        struct MyVisitor;

        impl<'de> Visitor<'de> for MyVisitor {
            type Value = MyType;

            fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
                f.write_str("a string, although we ask the deserializer for u64")
            }

            fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
                where E: de::Error
            {
                Ok(/* ... */)
            }
        }

        // It used to be that serde_json would ignore this hint and call visit_str
        // for string input, but in the general case that destroys compile times
        // by instantiating far more Visitor methods than are ever used.
        deserializer.deserialize_u64(MyVisitor)
    }
}

Don't miss a new serde_json release

NewReleases is sending notifications on new releases.