我正在实现JSON,并希望添加gRPC正文数据作为响应。
所以我试过了:
type Message struct {
Subject string `json:"subject"`
Body interface{} `json:"body"`
}proto3
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接口响应后:
{
"subject": "dev",
"body": "{\"name\":\"environment\",\"description\":\"The default environment\"}",
}问题是body JSON键值是动态的。有没有什么方法可以让我们得到这样的回应呢?
{
"subject": "dev",
"body": {"name":"environment","description":"The default environment"},
}发布于 2020-03-12 07:43:45
试试这个:转到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来获得我们想要的字符串
发布于 2020-03-12 08:01:21
如果您想要缺省的proto- to -JSON转换,我认为不可能像这样使用protocol buffer将真正任意的对象嵌入到有效负载中。
您可以注入自己的逻辑来完成到JSON的转换,并让它执行您所期望的操作。
根据您更广泛的目标,Any也可能是有用的。
请注意,此处的json标记:
type Message struct {
Subject string `json:"subject"`
Body interface{} `json:"body"`
}是不相关的。gRPC基于协议缓冲区类型Message生成JSON;这里的标签只影响Go json库如何呈现Go类型的Message。
https://stackoverflow.com/questions/60581330
复制相似问题