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.
Right? It's easier to deal with than the file-system or a full database so it tends to be my quick-and-dirty way to save data when starting something. Which is fine...until it isn't.
As an aside, in my brief benchmarking, using JSON as the data storage for UserDefaults values was both faster and slightly smaller than property lists.
I've benchmarked the same way back when on slow iOS hardware, but the ability to use JSON as the format is so briefly documented I was always worried it might go away.
plutil lists JSON as as a valid file format and as a valid key value type, but I've not seen it in the defaults documentation.