Go map转json

在Go中如何返回前端 字段名称/数量都不确定的json数据?

之前用Go写web服务,返回给前端的json格式的接口,有哪些要返回的字段都是明确的。都是预先定义一个结构体,json.Marshal一下即可~

但当有的场景,要返回哪些字段不确定时,就无法使用struct的方式。 还可以用map

go 复制代码
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))
}

输出为:

go 复制代码
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...](https://link.juejin.cn?target=https%3A%2F%2Fstackoverflow.com%2Fquestions%2F52966444%2Fis-google-protobuf-struct-proto-the-best-way-to-send-dynamic-json-over-grpc "https://stackoverflow.com/questions/52966444/is-google-protobuf-struct-proto-the-best-way-to-send-dynamic-json-over-grpc") "Is "google/protobuf/struct.proto" the best way to send dynamic JSON over GRPC?") **xxxx.proto**: ```go 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** 大致代码如下: ```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](https://link.juejin.cn?target=https%3A%2F%2Fgithub.com%2Fprotocolbuffers%2Fprotobuf%2Fblob%2Fmain%2Fsrc%2Fgoogle%2Fprotobuf%2Fstruct.proto "https://github.com/protocolbuffers/protobuf/blob/main/src/google/protobuf/struct.proto") [\[转\]Protobuf3 语法指南](https://link.juejin.cn?target=https%3A%2F%2Fcolobu.com%2F2017%2F03%2F16%2FProtobuf3-language-guide%2F "https://colobu.com/2017/03/16/Protobuf3-language-guide/")

相关推荐
小华同学ai19 分钟前
千万别错过!这个国产开源项目彻底改变了你的域名资产管理方式,收藏它相当于多一个安全专家!
前端·后端·github
Vowwwwwww23 分钟前
GIT历史存在大文件的解决办法
前端·git·后端
捡田螺的小男孩35 分钟前
京东一面:接口性能优化,有哪些经验和手段
java·后端·面试
艾露z43 分钟前
深度解析Mysql中MVCC的工作机制
java·数据库·后端·mysql
前端付豪1 小时前
揭秘网易统一日志采集与故障定位平台揭秘:如何在亿级请求中1分钟定位线上异常
前端·后端·架构
陈随易1 小时前
Lodash 杀手来了!es-toolkit v1.39.0 已完全兼容4年未更新的 Lodash
前端·后端·程序员
未来影子1 小时前
SpringAI(GA):Nacos3下的分布式MCP
后端·架构·ai编程
Hockor2 小时前
写给前端的 Python 教程三(字符串驻留和小整数池)
前端·后端·python
码农之王2 小时前
记录一次,利用AI DeepSeek,解决工作中算法和无限级树模型问题
后端·算法
Wo3Shi4七2 小时前
消息不丢失:生产者收到写入成功响应后消息一定不会丢失吗?
后端·kafka·消息队列