Works from command line on os x or linux distros, batch converts a directory. It's short and simple so it should be easy to modify for your own purposes.
If you run into issues with "invalid object in plist for destination format", you probably have bytes-like data in the plist, which plutil does not consider serializable to json.
Python has built-in plist support, and we can specify a custom default function to specify what to do when serialization fails (e.g. on bytes). If you don't care about the bytes fields, we can just serialize them as '<not serializable>' with the following python one-liner: