You have three choices:
1. You can encode your data in hash fields as you've described
2. You can encode your field names in your keys, which then are used for your nested structures - e.g. instead of trying to store a list of email addresses as: user:<id> -> {emails -> [list of emails], ...} you would store them as: user:<id>:emails -> [list of emails]
3. For values in your hash, you could use a semantic like "a null character prefix says that the value is stored in another key", which you would then use as: user:<id> -> {emails -> '\0external-key'}, external-key -> [list of emails]
Which one to use? If you are only ever writing once, but need to send the data to other clients (like in JSON format), then just store the data as an attribute like in #1, and ship your data straight without decoding it. If you need to fetch all of your data at the same time (again with few writes), and your client doesn't support pipelining, then that would suggest that #1 is still the right answer. But if you are changing your data regularly, can use pipelining, or need to fetch a subset of the data (instead of all of it) - that would suggest that you should use #2.
Regards,
- Josiah