共计 2005 个字符,预计需要花费 6 分钟才能阅读完成。
在 Go 中如何返回前端 字段名称 / 数量都不确定的 json 数据?
之前用 Go 写 web 服务,返回给前端的 json 格局的接口,有哪些要返回的字段都是明确的。都是事后定义一个构造体,json.Marshal 一下即可~
但当有的场景,要返回哪些字段不确定时,就无奈应用 struct 的形式。还能够用 map
package main
import (
"encoding/json"
"fmt"
)
func main() {Map2Json()
}
func Map2Json() {mapInstance := make(map[string]interface{})
mapInstance["Name"] = "cs"
mapInstance["Age"] = 28
mapInstance["Address"] = "杭州"
relation := make(map[string]interface{})
relation["father"] = "cuixxxxxxx"
relation["mother"] = "yinxxxxx"
relation["wife"] = "pengxx"
mapInstance["Relation"] = relation
pet := make(map[string]interface{})
pet["one"] = "弥弥懵"
pet["two"] = "黄橙橙"
pet["three"] = "呆呆"
pet["four"] = "皮瓜瓜"
pet["five"] = "斑斑"
mapInstance["Cat"] = pet
jsonStr, err := json.Marshal(mapInstance)
fmt.Println("err is:", err)
fmt.Println("jsonStr is:", string(jsonStr))
}
输入为:
err is: <nil>
jsonStr is: {"Address":"杭州","Age":28,"Cat":{"five":"斑斑","four":"皮瓜瓜","one":"弥弥懵","three":"呆呆","two":"黄橙橙"},"Name":"cs","Relation":{"father":"cuixxxxxxx","mother":"yinxxxxx","wife":"pengxx"}}
在 proto 中如何定义这样的返回值?
如果应用 proto 来定义接口,如何定义不确定字段名称和数量的返回值?
即下面的 jsonStr,如何定义能力返回给前端?
尝试应用过 Any,发现不行 (Any 的“风评”很不好,介绍时个别和one of 呈现在一起)
几经探究,发现这种状况该用 Struct(或说 Value)类型
Is “google/protobuf/struct.proto” the best way to send dynamic JSON over GRPC?
xxxx.proto:
syntax = "proto3";
package demo;
import "validate/validate.proto";
import "google/api/annotations.proto";
import "google/protobuf/timestamp.proto";
//import "google/protobuf/any.proto";
import "google/protobuf/struct.proto";
rpc Getxxxxx(GetxxxxxReq) returns (GetxxxxxResp) {option (google.api.http) = {get:"/api/v1/xxxx/xxxx/xxxxxx"};
}
message GetxxxxxResp {google.protobuf.Value data = 1;}
message GetxxxxxReq {
// 用户名
string user_name = 1
[(validate.rules).string.max_len = 100, (validate.rules).string.min_len = 1];
// 创立工夫
google.protobuf.Timestamp create_time = 2;
}
xxxx.go 大抵代码如下:
var rs xxxxx
mapInstance["default"] = mapDefault
jsonByteSli, err := json.Marshal(mapInstance)
v := &structpb.Value{}
err = protojson.Unmarshal(jsonByteSli, v)
rs.Data = v
return &rs, nil
struct.proto 源码:protobuf/src/google/protobuf/struct.proto
[[转]Protobuf3 语法指南](https://colobu.com/2017/03/16/Protobuf3-language-guide/)
本文由 mdnice 多平台公布
正文完