Hm, I don’t think I understand the concept entirely. So I’m not sure if it makes even sense to do this (for which benefit? you still need to parse the JSON to figure out where the strings are, right?). It certainly looks more complicate to me than Sharing `String`s between deserializations of a `JSON::Serializable` type · Issue #13638 · crystal-lang/crystal · GitHub which goes in a similar direction.
As you said StringPool might not be the right tool for what you want to do. It’s meant to deduplicate if you have many instances of the same string value, not shorten references to strings.
However, have you seen Optimize JSON parsing a bit by asterite · Pull Request #14366 · crystal-lang/crystal · GitHub ?
The JSON parsing algorithm can be optimized quite a bit without any fancy string caching.