解析JSON响应时遇com.google.protobuf类型不匹配错误求助
解决Protobuf解析ECMA-262 Big Number格式JSON的错误
问题核心
Protobuf的JsonFormat解析器无法识别ECMA-262规范的Big Number格式(数值后缀带n),当尝试将{"value":"640.0n","type":"Big Number"}解析为DOUBLE类型时,抛出com.google.protobuf.InvalidProtocolBufferException: Invalid value: {"value":"640.0n","type":"Big Number"} for expected type: DOUBLE。
解决方案
1. 预处理JSON字符串移除n后缀
在解析前对JSON字符串做正则替换,去掉所有Big Number的n后缀:
// 预处理JSON,移除Big Number的n后缀 String processedJson = originalJson.replaceAll("\"value\":\"(\\d+\\.?\\d*)n\"", "\"value\":\"$1\""); // 使用处理后的JSON进行解析 YourProtobufMessage.Builder builder = YourProtobufMessage.newBuilder(); JsonFormat.parser().merge(processedJson, builder); YourProtobufMessage message = builder.build();
2. 自定义Protobuf解析器的类型转换逻辑
通过registerTypeParser为DOUBLE类型注册自定义解析逻辑,直接处理带n的数值:
// 创建自定义解析器 JsonFormat.Parser customParser = JsonFormat.parser() .registerTypeParser(Double.class, value -> { // 移除n后缀并转为Double String cleanNum = value.toString().replace("n", ""); return Double.parseDouble(cleanNum); }); // 用自定义解析器解析JSON YourProtobufMessage.Builder builder = YourProtobufMessage.newBuilder(); customParser.merge(originalJson, builder); YourProtobufMessage message = builder.build();
3. 修改Protobuf字段类型为STRING(业务允许时)
如果业务场景允许,将对应的DOUBLE字段改为STRING类型,解析后手动转换为数值:
// 更新proto文件中的字段定义 message YourMessage { optional string value = 1; // 原字段为optional double value = 1; }
Java代码中解析后处理:
YourProtobufMessage message = ...; // 解析后的消息 String numStr = message.getValue().replace("n", ""); Double doubleValue = Double.parseDouble(numStr);
内容的提问来源于stack exchange,提问作者Sourav Singh
相关产品推荐
相关产品推荐

