在Go中如何返回前端 字段名称/数量都不确定的json数据?
之前用Go写web服务,返回给前端的json格式的接口,有哪些要返回的字段都是明确的。都是预先定义一个结构体,json.Marshal一下即可~
但当有的场景,要返回哪些字段不确定时,就无法使用struct的方式。 还可以用map
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 package mainimport ( "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)) }
输出为:
1 2 3 4 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 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 syntax = "proto3" ; package demo;import "validate/validate.proto" ;import "google/api/annotations.proto" ;import "google/protobuf/timestamp.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 大致代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 var rs xxxxxmapInstance["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://dashen.tech/2021/04/07/Go-map转json/
版权声明: 转载请注明出处.