Google Transcoder Pub/Sub作业更新通知消息无法解析问题咨询
问题根因
谷歌云转码服务的Pub/Sub作业更新通知的data字段设计为UTF-8编码的JSON字符串,并非Protobuf二进制序列化结果,你直接将字节流传入Protobuf二进制反序列化方法,自然会抛出InvalidProtocolBufferException异常。
正确解析方案
你推测的消息结构类型是正确的,data里嵌套的job字段完全匹配google.cloud.video.transcoder.v1beta1.Job的定义,只需要调整解析方式即可:
- 第一步:将
PubsubMessage的data字节数组按UTF-8编码解码为字符串 - 第二步:根据你的业务需求选择对应解析方式:
- 仅需提取少量字段:直接用任意通用JSON库解析字符串,提取
job下的对应字段即可 - 需要转换为
JobProtobuf对象:使用Protobuf官方提供的JSON解析工具,将job字段对应的JSON字符串反序列化为目标对象,不要使用Protobuf二进制反序列化API
- 仅需提取少量字段:直接用任意通用JSON库解析字符串,提取
参考示例(Java语言)
import java.nio.charset.StandardCharsets; import com.google.protobuf.util.JsonFormat; import com.google.cloud.video.transcoder.v1beta1.Job; import com.google.gson.JsonObject; import com.google.gson.JsonParser; // 从Pub/Sub消息中获取data字节数组并转成JSON字符串 String pubsubDataStr = new String(pubsubMessage.getData(), StandardCharsets.UTF_8); // 提取内层job对应的JSON片段 JsonObject pubsubJson = JsonParser.parseString(pubsubDataStr).getAsJsonObject(); String jobJson = pubsubJson.getAsJsonObject("job").toString(); // 用Protobuf JSON解析器转换为Job对象 Job.Builder jobBuilder = Job.newBuilder(); JsonFormat.parser().ignoringUnknownFields().merge(jobJson, jobBuilder); Job transcoderJob = jobBuilder.build();
内容的提问来源于stack exchange,提问作者TJ Liu
相关产品推荐
相关产品推荐

