使用protobuf-java-util库将Protobuf对象转换为JSON和反向转换

在Java中使用protobuf-java-util库将Protobuf对象转换为JSON格式,主要步骤如下:

  • 添加依赖‌
    需要引入protobuf-java和protobuf-java-util两个依赖:
xml 复制代码
<dependency>
    <groupId>com.google.protobuf</groupId>
    <artifactId>protobuf-java</artifactId>
    <version>3.23.1</version>
</dependency>
<dependency>
    <groupId>com.google.protobuf</groupId>
    <artifactId>protobuf-java-util</artifactId>
    <version>3.23.1</version>
</dependency>
  • 核心转换方法‌
    使用JsonFormat.printer()进行转换,可通过链式调用配置输出格式:
java 复制代码
import com.google.protobuf.util.JsonFormat;

public class ProtoJsonConverter {
    public static String protoToJson(com.google.protobuf.Message message) {
        try {
            return JsonFormat.printer()
                .omittingInsignificantWhitespace() // 去除换行
                .includingDefaultValueFields()     // 包含默认值字段
                .print(message);
        } catch (Exception e) {
            throw new RuntimeException("Proto转JSON失败", e);
        }
    }
}
  • 使用示例‌
    假设已通过proto文件生成Test类:
java 复制代码
Test test = Test.newBuilder()
    .setA("value1")
    .setB(123)
    .build();
String json = ProtoJsonConverter.protoToJson(test);
System.out.println(json); // 输出:{"a":"value1","b":123}

注意事项‌:

  • 默认会忽略值为空的字段,可通过.includingDefaultValueFields()显示默认值字段
  • 转换时可能丢失Protobuf特有的类型信息,如枚举值会转为字符串
    反向转换(JSON转Protobuf)需使用JsonFormat.parser()

在Java中实现Protobuf对象到JSON的反向转换(即JSON转Protobuf),可通过protobuf-java-util库的JsonFormat.parser()实现。以下是具体方法和注意事项:

核心步骤‌

  • 添加依赖‌
    需引入protobuf-java和protobuf-java-util依赖(版本建议≥3.19.1):
xml 复制代码
<dependency>
    <groupId>com.google.protobuf</groupId>
    <artifactId>protobuf-java</artifactId>
    <version>3.23.1</version>
</dependency>
<dependency>
    <groupId>com.google.protobuf</groupId>
    <artifactId>protobuf-java-util</artifactId>
    <version>3.23.1</version>
</dependency>
  • JSON转Protobuf方法‌
    使用JsonFormat.parser()解析JSON字符串并填充到Protobuf Builder中:
java 复制代码
import com.google.protobuf.Message.Builder;
import com.google.protobuf.util.JsonFormat;

public class JsonProtoConverter {
    public static <T extends Builder> T jsonToProto(String json, T builder) {
        try {
            JsonFormat.parser().merge(json, builder);
            return builder;
        } catch (Exception e) {
            throw new RuntimeException("JSON转Protobuf失败", e);
        }
    }
}
  • 使用示例‌
    假设有生成的UserProto.User类:
java 复制代码
String json = "{\"name\":\"Alice\",\"age\":30}";
UserProto.User.Builder builder = UserProto.User.newBuilder();
UserProto.User user = JsonProtoConverter.jsonToProto(json, builder).build();
System.out.println(user.getName()); // 输出:Alice

注意事项‌

  • 字段匹配‌:JSON字段名需与Protobuf定义的字段名完全一致(包括大小写)
  • 默认值处理‌:若JSON中缺失字段,Protobuf会使用默认值(如数值为0,字符串为空)
  • 特殊类型‌:枚举值需传递字符串名称,时间戳需符合RFC 3339格式
  • 性能优化‌:频繁转换时可复用JsonFormat.Parser实例