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
|
3天前
|
存储 安全 Java
Go 基础数据结构的底层原理(slice,channel,map)
Go 基础数据结构的底层原理(slice,channel,map)
56 0
|
3天前
|
存储 缓存 安全
Go Map 的 11 连问
Go Map 的 11 连问
28 0
|
3天前
|
Go
go map进行有序的排序
go map进行有序的排序
20 0
|
3天前
|
Go
|
3天前
|
JSON 数据格式
使用 Gson 将 Map、List等转换为json string
使用 Gson 将 Map、List等转换为json string
13 0
|
3天前
|
JSON 编解码 Go
【Go语言专栏】Go语言中的JSON编码与解码
【4月更文挑战第30天】Go语言内置JSON编码解码支持,简化了数据交换。`json.Marshal`用于将Go结构体转换为JSON,如示例中`Person`结构体的编码。`json.Unmarshal`则将JSON数据反序列化到结构体,需传入结构体变量的地址。错误处理至关重要,特别是在处理大量数据时,要注意性能优化,如避免不必要的转换和重复操作。了解自定义编码解码和最佳实践能提升开发效率。掌握这些技能,有助于构建高效Go应用。
|
3天前
|
JSON JavaScript 前端开发
Golang深入浅出之-Go语言JSON处理:编码与解码实战
【4月更文挑战第26天】本文探讨了Go语言中处理JSON的常见问题及解决策略。通过`json.Marshal`和`json.Unmarshal`进行编码和解码,同时指出结构体标签、时间处理、omitempty使用及数组/切片区别等易错点。建议正确使用结构体标签,自定义处理`time.Time`,明智选择omitempty,并理解数组与切片差异。文中提供基础示例及时间类型处理的实战代码,帮助读者掌握JSON操作。
23 1
Golang深入浅出之-Go语言JSON处理:编码与解码实战
|
3天前
|
存储 编译器 Go
Golang深入浅出之-掌握Go语言Map:初始化、增删查改与遍历
【4月更文挑战第21天】Go语言中的`map`提供快速的键值对操作,包括初始化、增删查改和遍历。初始化时,推荐使用`make()`函数,如`make(map[string]int)`。插入和查询键值对直接通过索引访问,更新则重新赋值。删除键值对需用`delete()`函数,确保键存在。遍历map常用`for range`,注意避免在遍历中修改map。了解这些并避免易错点,能提升代码效率和可读性。
22 1
Golang深入浅出之-掌握Go语言Map:初始化、增删查改与遍历
|
3天前
|
存储 缓存 安全
掌握Go语言:Go语言Map,高效键值对集合的应用与注意事项详解(26)
掌握Go语言:Go语言Map,高效键值对集合的应用与注意事项详解(26)