I have an existing system, which is using protobuf-based communication protocol between GUI and server. Now I would like to add some persistence, but at the moment protobuf messages are straight converted to a third-party custom objects.
Is there a way to convert proto messages to json, which could be then persisted to database.
N.B.: I don't much like an idea of writing binary protobuf to database, because it can one day become not backward-compatible with newer versions and break the system that way.
Generics Solution
Here's a generic version of Json converter
Using it is as simple as follows:
Message instance
To Json Generic
From Json Generic
Adding to Ophirs answer, JsonFormat is available even before protobuf 3.0. However, the way to do it differs a little bit.
In Protobuf 3.0+, the JsonFormat class is a singleton and therefore do something like the below
In Protobuf 2.5+, the below should work
Here is a link to a tutorial I wrote that uses the JsonFormat class in a TypeAdapter that can be registered to a GsonBuilder object. You can then use Gson's toJson and fromJson methods to convert the proto data to Java and back.
Replying to jean . If we have the protobuf data in a file and want to parse it into a protobuf message object, use the merge method TextFormat class. See the below snippet:
Try
JsonFormat.printer().print(MessageOrBuilder)
, it looks good for proto3. Yet, it is unclear how to convert the actualprotobuf
message (which is provided as the java package of my choice defined in the .proto file) to a com.google.protbuf.Message object.As mentioned in an answer to a similar question, since v3.1.0 this is a supported feature of ProtocolBuffers. For Java, include the extension module com.google.protobuf:protobuf-java-util and use JsonFormat like so:
We are currently using protobuf-java-format to convert our Protobuf messages (anything subclass of
Message
) into a JSON format to send over our web API.Simply do:
Converting protobuf to JSON for storage and then back to protobuf on load is much more likely to create compatibility problems, because:
With all that said, there are many libraries out there for converting protobufs to JSON, usually built on the Protobuf reflection interface (not to be confused with the Java reflection interface; Protobuf reflection is offered by the
com.google.protobuf.Message
interface).