BTW: don't put temporary scope-bound loans in structs &str. This forbids the structs from storing the data, and instead makes them views into data kept in some variable, and will cause you endless problems with the borrow checker. In some cases it's literally impossible to deserialize JSON into &str. String is the correct type for storing strings in structs.
You can't deserialize into a reference. There would be no owner to hold the value. You can use a Cow to dynamically switch between owned and borrowed data.
The type of the visitor or the trait has to depend on the type parameter, otherwise there would be overlapping impls (many different impls of the same trait on the same type for each choice of T).
Since in your case, it doesn't make sense for the trait to depend on the type (Deserialize is not generic over a type), the only possibility is to introduce a type parameter for the Visitor, that carries over the type information to the impl: