I can quickly think of a way in which this can be done off the top of my head.
You can encrypt the data asymmetrically then pin it on IPFS. The IPFS endpoint can be stored within the ERC721 URI. Your Dapp could read and download the IPFS data and asymmetrically decrypt it with the user's private key.
An issue you would have would be getting a hold of the user's public key to perform encryption. Wallet connect as far as I am aware, and I may be wrong, does not expose a public key, only an address. Your Dapp would have to reconstruct each user's public key from a transaction that they have signed. see this -> Get public key of any ethereum account
You can get around this by having your user send a transaction to a contract registering to your Dapp, store the address of that transaction then reconstruct the user's public key from there.
The same is true the other way around. Wallet connect will not expose the user's private key. The user will have to input their private key into the Dapp or perform decryption of your JSON offline.
As I said at the top, these are just initial thoughts about limitations you may have, there could be other ways in which this is possible. I think this is a very interesting use case so let me know which approach you end up taking.
sign()function of WalletConnect. What do you think? – user66732 Mar 28 '21 at 13:57