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

如何在gRPC proto文件中定义结构适配指定JSON数组格式

修改proto适配顶层JSON数组的方案

分两种常用场景处理:

场景1:使用gRPC网关(grpc-gateway)做JSON转码

这是改造成本最低的方案,只需要调整HTTP注解配置即可实现自动映射:

  1. 原有单个操作的Op消息定义保持不变,请求消息仅保留一个repeated类型的Op字段
  2. 在HTTP规则的body字段直接指定这个repeated字段的名称,转码时会自动把顶层JSON数组映射到该字段上
    示例proto代码:
syntax = "proto3";

import "google/api/annotations.proto";
import "google/protobuf/value.proto";

// 单个操作定义保持不变
message Op {
  string op = 1;
  string path = 2;
  google.protobuf.Value value = 3;
}

// 请求消息仅保留一个repeated Op字段
message UpdateResourceRequest {
  repeated Op ops = 1;
}

message UpdateResourceResponse {
  // 按业务需求定义返回字段
}

service ResourceService {
  rpc UpdateResource(UpdateResourceRequest) returns (UpdateResourceResponse) {
    option (google.api.http) = {
      patch: "/v1/your-resource/{resource_id}" // 替换为实际接口路径
      body: "ops" // 核心配置:直接把请求体映射到repeated类型的ops字段
    };
  }
}

配置完成后,gRPC网关会自动将顶层JSON数组的请求直接映射到ops字段,不需要外层的{"ops": [...]} 包裹。

场景2:直接使用protobuf JSON序列化/反序列化(无gRPC网关)

protobuf的标准JSON序列化规则要求,message类型永远对应JSON对象,无法直接映射到JSON数组。这种情况需要用google.api.HttpBody接收原始JSON请求,自行解析为Op数组:
示例proto代码:

syntax = "proto3";

import "google/api/httpbody.proto";
import "google/protobuf/value.proto";

message Op {
  string op = 1;
  string path = 2;
  google.protobuf.Value value = 3;
}

message UpdateResourceResponse {
  // 按业务需求定义返回字段
}

service ResourceService {
  rpc UpdateResource(google.api.HttpBody) returns (UpdateResourceResponse);
}

后续在业务代码中读取HttpBody的data字段,用JSON库解析为Op数组处理即可。

内容的提问来源于stack exchange,提问作者Santhosh Sridhar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 08:54:02