首页 > 解决方案 > json封送数据的proto3消息类型

问题描述

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

所以我试过:

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

原型3

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

接口代码:

    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"},
}

标签: goprotocol-buffersgrpc-goproto3

解决方案


试试这个:去 go 游乐场(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 来获取我们想要的字符串


推荐阅读