1. Overview
In this tutorial, we'll demonstrate how to convert from JSON to Protobuf and from Protobuf to JSON.
Protobuf is a free and open-source cross-platform data format used to serialize structured data.
2. Maven Dependency
To start, let's create a Spring Boot project by including the protobuf-java-util dependency:
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java-util</artifactId>
<version>3.21.5</version>
</dependency>
3. Convert JSON to Protobuf
We can convert JSON to a protobuf message by using JsonFormat. JsonFormat is a utility class to convert protobuf messages to/from JSON format. JsonFormat's parser() creates a Parser, which uses the merge() method to parse JSON to protobuf message.
Let's create a method that takes JSON and generates a protobuf message:
public static Message fromJson(String json) throws IOException {
Builder structBuilder = Struct.newBuilder();
JsonFormat.parser().ignoringUnknownFields().merge(json, structBuilder);
return structBuilder.build();
}
Let's use the following sample JSON:
{
"boolean": true,
"color": "gold",
"object": {
"a": "b",
"c": "d"
},
"string": "Hello World"
}
Now, let's write a simple test to validate the conversion from JSON to protobuf message:
@Test
public void givenJson_convertToProtobuf() throws IOException {
Message protobuf = ProtobufUtil.fromJson(jsonStr);
Assert.assertTrue(protobuf.toString().contains("key: \"boolean\""));
Assert.assertTrue(protobuf.toString().contains("string_value: \"Hello World\""));
}
4. Convert Protobuf to JSON
We can convert protobuf message to JSON by using JsonFormat‘s printer() method, which accepts protobuf as a MessageOrBuilder:
public static String toJson(MessageOrBuilder messageOrBuilder) throws IOException {
return JsonFormat.printer().print(messageOrBuilder);
}
Let's write a simple test to validate the conversion from protobuf to JSON message:
@Test
public void givenProtobuf_convertToJson() throws IOException {
Message protobuf = ProtobufUtil.fromJson(jsonStr);
String json = ProtobufUtil.toJson(protobuf);
Assert.assertTrue(json.contains("\"boolean\": true"));
Assert.assertTrue(json.contains("\"string\": \"Hello World\""));
Assert.assertTrue(json.contains("\"color\": \"gold\""));
}
5. Conclusion
In this article, we've demonstrated how we can convert JSON to protobuf and vice versa.
As always, all code samples used in this tutorial are available over on GitHub.
Course – LS (cat=JSON/Jackson) res – REST with Spring (eBook) (everywhere)