Ahh, smart move. So it is best to decode json from the same instance and make sure that instance exists the entire game to prevent leaks.
Pools are global variables, you don’t have to do anything specific.
If you are replicating the regular json_encode/decode, you don’t need pools since you can be adding data to the new map/list directly.
Self-references can be handled by limiting max depth or forming a <ref>->index map (so that non-first references would be saved as “ref#X”, for example)