Doh, I apparently misread your original email, thinking you were talking about the generated Go code only.
FWIW, I think most decoders (for the runtimes that support JSON encoding) support either: they first look for a matching name per JSON name, and, if no field is found, they fall back to looking for a matching proto name. Perhaps that may help if you are trying to, for eaxmple, bridge a pre-3.0 custom JSON encoding with proto3 canonical JSON encoding (just kind of guessing at your possible reason for needing this distinction). If that is the motivation, you might also watch out for the custom JSON encoding for well-known types and how one-ofs are handled (e.g. one-of names never appear in JSON; their constituents are flattened into the enclosing message).