关于后端: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"}}


在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:


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 语法指南](https://colobu.com/2017/03/16/Protobuf3-language-guide/)

本文由mdnice多平台公布

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理