Go map转json

简介: Go map转json

在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"}}

微信截图_20230925204001.png

在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

[转]Protobuf3 语法指南

目录
相关文章
|
3月前
|
Go
Go 语言为什么不支持并发读写 map?
Go 语言为什么不支持并发读写 map?
|
2月前
|
Go 定位技术 索引
Go 语言Map(集合) | 19
Go 语言Map(集合) | 19
|
3月前
|
存储 算法 Java
Go 通过 Map/Filter/ForEach 等流式 API 高效处理数据
Go 通过 Map/Filter/ForEach 等流式 API 高效处理数据
|
3月前
|
存储 安全 NoSQL
Go map 读写性能优化 - 分片 map
Go map 读写性能优化 - 分片 map
45 1
|
3月前
|
存储 人工智能 安全
go sync.Map 设计与实现
go sync.Map 设计与实现
34 1
|
3月前
|
JSON 人工智能 编译器
Go json 能否解码到一个 interface 类型的值
Go json 能否解码到一个 interface 类型的值
30 1
|
3月前
|
JSON Go 数据格式
Go - json.Unmarshal 遇到的小坑
Go - json.Unmarshal 遇到的小坑
59 9
|
3月前
|
算法 安全 Go
go 语言中 map 的相关知识
go 语言中 map 的相关知识
|
3月前
|
存储 缓存 Go
如何检查 Go map 是否包含某个键?
【8月更文挑战第31天】
31 0
|
3月前
|
JSON Go 数据格式
Go实现json字符串与各类struct相互转换
文章通过Go语言示例代码详细演示了如何实现JSON字符串与各类struct之间的相互转换,包括结构体对象生成JSON字符串和JSON字符串映射到struct对象的过程。
31 0
下一篇
无影云桌面