• Go map转json


    今天分享的知识是 Go 接口。如果本文对你有帮助,不妨点个赞,如果你是 Go 语言初学者,不妨点个关注,一起成长一起进步,如果本文有错误的地方,欢迎指出!

    但当有的场景,要返回哪些字段不确定时,就无法使用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))
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    输出为:

    err is: <nil>
    jsonStr is: {"Address":"杭州","Age":28,"Cat":{"five":"斑斑","four":"皮瓜瓜","one":"弥弥懵","three":"呆呆","two":"黄橙橙"},"Name":"cs","Relation":{"father":"cuixxxxxxx","mother":"yinxxxxx","wife":"pengxx"}}
    
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    在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;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    xxxx.go 大致代码如下:

    ar rs xxxxx
    mapInstance["default"] = mapDefault
    
    jsonByteSli, err := json.Marshal(mapInstance)
    
    
    v := &structpb.Value{}
    
    err = protojson.Unmarshal(jsonByteSli, v)
    
    rs.Data = v
    return &rs, nil
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 相关阅读:
    【数据结构】B树与B+树的联系与区别
    Ansible中的任务执行控制
    【408数据结构与算法】—栈和队列(七)
    03-Zookeeper客户端使用
    【SLAM】 前端-视觉里程计之相对位姿估计
    【知识总结】金九银十offer拿到手软的前端面试题——Web篇
    node.js+vscode安装与配置
    记录:Unity脚本的编写
    死锁(什么是死锁、怎样预防死锁、避免死锁、检测和解除)
    XML文档基础
  • 原文地址:https://blog.csdn.net/m0_73728511/article/details/133795692