You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解析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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 22:43:18