Keys have to consist of [A-Za-z0-9-_] and doing a restriction is pretty important to identify keys in odd formats.
We can change the set of characters pretty easily but for now it is hardcoded.
I have a pending patchset that adds '.' as a char, as I needed that, and that's what syslog-ng uses to separate key portions.
Would using a dot work for you? Then it would ve pretty easy to do the json conversion right within syslog-ng.
Something like:
parser { kv-parser(); };
destination { file("foobar" template("$(format-json *)\n")); };
Format json would generate embedded objects at dot boundaries.