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 语法指南

目录
相关文章
go语言中遍历映射(map)
go语言中遍历映射(map)
301 8
|
5月前
|
存储 人工智能 安全
深入理解 go sync.Map - 基本原理
本文介绍了 Go 语言中 `map` 在并发使用时的常见问题及其解决方案,重点对比了 `sync.Mutex`、`sync.RWMutex` 和 `sync.Map` 的性能差异及适用场景。文章指出,普通 `map` 不支持并发读写,容易引发错误;而 `sync.Map` 通过原子操作和优化设计,在某些场景下能显著提升性能。同时详细讲解了 `sync.Map` 的基本用法及其适合的应用环境,如读多写少或不同 goroutine 操作不同键的场景。
232 1
|
7月前
|
存储 安全 Go
Map的遍历与判断键是否存在-《Go语言实战指南》
本文介绍了 Go 语言中对 `map` 的常见操作,包括遍历所有项和判断键是否存在。通过 `for range` 可以遍历 `map` 的键值对、仅键或仅值(需忽略键)。注意,`map` 遍历顺序是随机的。判断键是否存在时,使用双赋值语法 `value, ok := map[key]`,其中 `ok` 表示键是否存在。直接访问不存在的键会返回类型的零值,可能导致逻辑错误。掌握这些机制可更安全高效地处理键值对数据。
|
7月前
|
JSON JavaScript 前端开发
Go语言JSON 序列化与反序列化 -《Go语言实战指南》
本文介绍了 Go 语言中使用 `encoding/json` 包实现 JSON 与数据结构之间的转换。内容涵盖序列化(`Marshal`)和反序列化(`Unmarshal`),包括基本示例、结构体字段标签的使用、控制字段行为的标签(如 `omitempty` 和 `-`)、处理 `map` 和切片、嵌套结构体序列化、反序列化未知结构(使用 `map[string]interface{}`)以及 JSON 数组的解析。最后通过表格总结了序列化与反序列化的方法及类型要求,帮助开发者快速掌握 JSON 数据处理技巧。
|
10月前
|
存储 缓存 安全
Go 语言中的 Sync.Map 详解:并发安全的 Map 实现
`sync.Map` 是 Go 语言中用于并发安全操作的 Map 实现,适用于读多写少的场景。它通过两个底层 Map(`read` 和 `dirty`)实现读写分离,提供高效的读性能。主要方法包括 `Store`、`Load`、`Delete` 等。在大量写入时性能可能下降,需谨慎选择使用场景。
|
11月前
|
存储 安全 Go
Go语言中的map数据结构是如何实现的?
Go 语言中的 `map` 是基于哈希表实现的键值对数据结构,支持快速查找、插入和删除操作。其原理涉及哈希函数、桶(Bucket)、动态扩容和哈希冲突处理等关键机制,平均时间复杂度为 O(1)。为了确保线程安全,Go 提供了 `sync.Map` 类型,通过分段锁实现并发访问的安全性。示例代码展示了如何使用自定义结构体和切片模拟 `map` 功能,以及如何使用 `sync.Map` 进行线程安全的操作。
308 9
go语言for遍历映射(map)
go语言for遍历映射(map)
416 12
|
JSON JavaScript 前端开发
Go语言中json序列化的一个小坑,建议多留意一下
在Go语言开发中,JSON因其简洁和广泛的兼容性而常用于数据交换,但其在处理数字类型时存在精度问题。本文探讨了JSON序列化的一些局限性,并介绍了两种替代方案:Go特有的gob二进制协议,以及msgpack,两者都能有效解决类型保持和性能优化的问题。
385 7
|
存储 Go
go语言 遍历映射(map)
go语言 遍历映射(map)
348 2
|
JSON 前端开发 JavaScript
聊聊 Go 语言中的 JSON 序列化与 js 前端交互类型失真问题
在Web开发中,后端与前端的数据交换常使用JSON格式,但JavaScript的数字类型仅能安全处理-2^53到2^53间的整数,超出此范围会导致精度丢失。本文通过Go语言的`encoding/json`包,介绍如何通过将大整数以字符串形式序列化和反序列化,有效解决这一问题,确保前后端数据交换的准确性。
347 4

热门文章

最新文章