go - 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"},
}
解决方案
试试这个:去 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 来获取我们想要的字符串
推荐阅读
- file - 如何弄清楚如何反编译 .rsc 文件?
- c# - 如何在 C# 中使用亚马逊 S3?
- javascript - 流式输入的奇怪问题
- android - 如何在一个 android studio 项目中为两种不同类型的用户提供两种不同的导航抽屉活动?
- c# - 值不能为空。ASP.NET Core 3..0 中的(参数“键”)
- firebase - 我的反应本机项目firebase模块中的问题无法识别
- arrays - Postgres - 无法在 UUID 上加入 Json 数组值
- java - 为什么分配单个 2D 数组比分配具有相同总大小和形状的多个 1D 数组的循环花费更长的时间?
- create-react-app - 为什么运行创建反应应用程序时会出现盖茨比浏览器错误?
- ruby-on-rails - 参考 CarrierWave 的官方文档,但图片未显示