Thanks. Are you familiar with Node Red? The following will make more sense if you are.
I setup a Node Red flow with an Inject node and UDP out node. If the Inject Node injects {"on":false, "bri":0} as a string, the PacketIn receives the sting and I can parse it with the JSONparse. If the Inject Node injects {"on":false, "bri":0} as a JSON Object, the PacketIn receives 30 bytes of integers but JSONparse doesn't know what to do with it. If the Inject Node injects {"off":true, "bri":0} as a JSON Object, the PacketIn receives the same 30 bytes of integers (no change). In fact, it doesn't seem to matter what the JSON object content is, PacketIn always gets the same 30 bytes.
While I understand the higher level concept of UDP, I don't understand whats going on at the lower levels so I'm not sure how to diagnose the issue.