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

C#中序列化Protobuf适配Postman的GRPC请求问题

适配Postman的GrpcRequest序列化方案及Postman兼容性说明

一、C#中生成符合Postman要求的Protobuf JSON格式

不要用System.Text.Json.JsonSerializer,直接使用Google官方提供的Google.Protobuf.JsonFormatter——它专门处理Protobuf消息到JSON的序列化,完全遵循proto3 JSON规范,能自动处理StringValue、Timestamp这类Well-Known Type的结构。

实现步骤:

  1. 确保项目已安装Google.Protobuf NuGet包(版本需与你的gRPC工具链匹配)。
  2. 序列化代码示例:
using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;

var request = new GrpcRequest
{
    Name = StringValue.FromString("MyRequest"),
    StartDate = Timestamp.FromDateTime(DateTime.UtcNow)
};

// 自定义格式化:输出seconds/nanos结构的Timestamp,匹配预期格式
var customFormatter = new JsonFormatter(new JsonFormatter.Settings
{
    PreserveProtoFieldNames = true,
    UseProto3Json = false, // 禁用RFC3339格式,输出seconds/nanos
    OutputDefaultValues = true
});
string targetJson = customFormatter.Format(request);

生成的JSON会完全符合Postman预期:

{
  "name": {
    "value": "MyRequest"
  },
  "startDate": {
    "seconds": "1702854000",
    "nanos": 0
  }
}

二、Postman能否直接接收现有JSON?

不行。Postman的gRPC请求解析严格遵循Protobuf JSON规范,你当前用System.Text.Json生成的JSON(把StringValue直接序列化为字符串)不符合规范,Postman无法将其正确映射到Protobuf消息,会触发格式错误。

如果不想修改C#代码,可通过Postman的Pre-request Script自动转换格式:

// 转换name为{value: ...}结构,同时将seconds转为字符串
const rawBody = pm.request.body.raw;
const bodyObj = JSON.parse(rawBody);

if (typeof bodyObj.name === 'string') {
    bodyObj.name = { value: bodyObj.name };
}
if (typeof bodyObj.startDate?.seconds === 'number') {
    bodyObj.startDate.seconds = bodyObj.startDate.seconds.toString();
}

pm.request.body.raw = JSON.stringify(bodyObj, null, 2);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 17:40:26