【问题标题】:proto3 message type for json marshal datajson封送数据的proto3消息类型
【发布时间】:2020-06-20 04:59:51
【问题描述】:

我正在实现一个 gRPC API,并希望添加 JSON 正文数据作为响应。

所以我试过了:

type Message struct {
    Subject string `json:"subject"`
    Body    interface{}  `json:"body"`
}

proto3

message Message {
    string subject = 1;
    string body = 2;
}

API 代码:

    en, err := client.Request.Get(req.Name)
    if err != nil {
        return nil, status.Error(codes.InvalidArgument, err.Error())
    }

    data, _ := json.Marshal(en.Body)

    return &response.Message{
        Subject: en.Subject,
        Body:    string(data),
    }, nil

添加此获取 gRPC API 响应后:

{
  "subject": "dev",
  "body": "{\"name\":\"environment\",\"description\":\"The default environment\"}",
}

问题是正文 JSON 键值是动态的。 有什么方法可以让我们得到类似的响应

{
  "subject": "dev",
  "body": {"name":"environment","description":"The default environment"},
}

【问题讨论】:

    标签: go protocol-buffers grpc-go proto3


    【解决方案1】:

    试试这个: 去围棋游乐场 (https://play.golang.org/) 然后把它放进去:

    package main
    
    import (
        "fmt"
        "encoding/json"
        "strconv"
    )
    
    
    func main() {
    
        b := []byte(`"{\"name\":\"environment\",\"description\":\"The default environment\"}"`)
        fmt.Println(string(b))
    
    
        var msg string
            json.Unmarshal([]byte(b), &msg)
    
        smsg, _ := strconv.Unquote(string(b))
    
        fmt.Println(smsg)
    
    
    }
    

    我们正在做的是解组编组的响应,然后使用 strconv unquote 来获取我们想要的字符串

    【讨论】:

      【解决方案2】:

      如果您想要默认的 proto-to-JSON 转换,我认为不可能像这样使用协议缓冲区将真正的任意对象嵌入到有效负载中。

      您可以注入自己的逻辑来转换为 JSON 并让它按照您的期望进行。

      根据您更广泛的目标,Anys 也可能有用。


      注意这里的json标签:

      type Message struct {
          Subject string `json:"subject"`
          Body    interface{}  `json:"body"`
      }
      

      不相关。 gRPC 正在基于 protocol buffer 类型 Message 生成 JSON;这里的标签只影响 Go json 库如何渲染 Go 类型 Message

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-12
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-31
        • 2019-12-28
        相关资源
        最近更新 更多