I use onWorkspaceChange to trigger conversion of blocks to python code. This fires consistently.
I used onJsonChange to trigger conversion of blocks to string (JSON.stringify) to update state. This doesn't fire consistently.
For example, edit an existing workspace with two random string blocks:
1 - edit first string and hit enter. Both onWorkspaceChange and onJsonChange fire as expected
2 - edit second string and hit enter. Only onWorkspaceChange fires.
3 - click elsewhere to deselect second string. Only onJsonChange fires (late).
To get around this inconsistency, I've switched to rely entirely on the onWorkspaceChange event.