GRPC中如何在JSON中正确表示int64类型值?
Protobuf int64类型JSON解析错误的解决方法
问题分析
你的场景中出现解析错误,主要有两个核心原因:
JSON结构不匹配:如果你的
msg是foo.Bar类型实例,JSON不应该在外层嵌套"Bar"键——Protobuf的JSON映射规则是直接对应消息字段,而非将整个消息包裹在消息名的键下。解析器选项未配置: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
相关产品推荐
相关产品推荐

