在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?](stackoverflow.com/questions/5… "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