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

GRPC中如何在JSON中正确表示int64类型值?

Protobuf int64类型JSON解析错误的解决方法

问题分析

你的场景中出现解析错误,主要有两个核心原因:

  1. JSON结构不匹配:如果你的msg是foo.Bar类型实例,JSON不应该在外层嵌套"Bar"键——Protobuf的JSON映射规则是直接对应消息字段,而非将整个消息包裹在消息名的键下。

  2. 解析器选项未配置:Protobuf默认JSON解析规则不允许将字符串作为int64类型的值解析,尽管规范中允许用字符串表示int64(避免JavaScript数字溢出问题),但需要显式开启对应解析选项。

正确解决步骤

步骤1:修正JSON结构

如果msg直接对应Bar类型,正确的JSON格式应为:

{
  "spec": "somepath/somefile.txt",
  "compatibility_key": "17457183487633360448"
}

若你的JSON外层必须保留Bar键,则需确保msg对应的是包含Bar字段的父消息类型,而非直接使用Bar类型。

步骤2:配置解析器选项

调用JsonStringToMessage时,传入JsonParseOptions并开启allow_numbers_as_strings选项,允许将字符串形式的数值解析为int64类型:

#include <google/protobuf/util/json_util.h>

// 初始化消息实例
foo::Bar msg;
// 修正后的JSON字符串
std::string json_string = R"({
  "spec": "somepath/somefile.txt",
  "compatibility_key": "17457183487633360448"
})";

// 配置解析选项
google::protobuf::util::JsonParseOptions options;
options.allow_numbers_as_strings = true;

// 执行解析
google::protobuf::util::Status pb_status = google::protobuf::util::JsonStringToMessage(json_string, &msg, options);
if (!pb_status.ok()) {
    // 处理解析错误
}

补充说明

Protobuf JSON映射规范中,int64类型支持数字或字符串两种表示形式,但由于JavaScript的Number类型无法精确表示超过2^53的整数,因此推荐用字符串形式。但默认解析器为严格校验,会拒绝字符串形式的数值,必须显式开启allow_numbers_as_strings才能正常解析。

内容的提问来源于stack exchange,提问作者Eric Brown

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 12:45:02