You can save it as a String, but then you are just going to need to parse it when you load it. Unless it really needs to be JSON I would probably just convert it to one of the property list types and then use it in my code like that.
Also synchronize() doesn't actually do anything anymore. I think it's only hung around to prevent old stuff from breaking.
The things I've found to keep in mind is that UserDefaults are meant for small, fully replaceable data. Don't try and use it as a database or file system. If it's a large structure or something where you'll need to update, (not replace), the Model schema you're better of using other solutions.
Unfortunately that's not always easy to do. The Types allowed in a P-List are relatively constrained, it adds an additional serialization format you have to support/test, it's also larger and less portable than JSON.
If it doesn't cause you any performance issues (because your are storing a lot of data this way) then it's perfectly fine. I used this a couple years ago as it has a 1 liner API: https://github.com/Nirma/Default