Golang Go语言中如何转换map key是struct的json

发布于 1周前 作者 phonegap100 来自 Go语言

Golang Go语言中如何转换map key是struct的json

{
“map”: {
{
“name”: “js”,
“age”: 18
}: {
“id”: 10,
“port”: 1234
}
}
}

转换成

type ST2 struct {
	Id int `json:"id"`
	Port int `json:"port"`
}

type ST1 struct { Name string json:"name" Age int json:"age" }

type ST struct { Map map[ST1]ST2 json:"map" }

网上找了一堆,都是 map[string]struct 的转换,到这种 map[struct]struct 就不行了

报错信息是

invalid character '{' looking for beginning of object key string

更多关于Golang Go语言中如何转换map key是struct的json的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

10 回复

json 的 key 只有 string 一个类型……

更多关于Golang Go语言中如何转换map key是struct的json的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


是的,严格来说这已经不是 json 了,但是我目前从 服务端拉下来的数据就张这个样子,我想看看有没有什么库能直接用的,不然我就得自己写解析了

在 Java 里好像有个叫做 JSON.parseObject(String jstr, Class<T> clazz) 的东西,但是我没看懂

能看到服务器的代码吗?好奇怎么拼出来的,这样真的符合 JSON 的标准吗?

同意楼上,你这个也不是 json 啊

这个是用 java 的 fastjson 做的



不让上链接,可以直接去 github 上搜 alibaba/fastjson

服务端是也是 阿里的 rocketmq
服务端 encode 代码:
/broker/src/main/java/org/apache/rocketmq/broker/processor/AdminBrokerProcessor.java#L920

java 的客户端解析代码
/client/src/main/java/org/apache/rocketmq/client/impl/MQClientAPIImpl.java#L1213

这肯定是不符合 JSON 标准的,但阿里的东西向来就是这样

在Go语言中,如果你有一个map,其key是结构体类型,并且你需要将这个map转换为JSON格式,直接序列化会遇到问题,因为JSON的key必须是字符串类型。

要解决这个问题,你可以采取以下几种策略:

  1. 将结构体key转换为字符串: 你可以定义一个辅助函数,将结构体转换为唯一的字符串表示(例如,通过JSON序列化结构体作为字符串)。然后,使用这个字符串作为新的map的key,将原始map的值存储在新的map中。

  2. 自定义序列化逻辑: 实现自定义的序列化逻辑,遍历原始map,将结构体key转换为字符串,并手动构建JSON对象。

  3. 使用第三方库: 有些第三方库可能提供了更简便的方法来处理这种情况,比如通过标签或自定义序列化逻辑来辅助处理。

示例代码(将结构体key JSON序列化作为字符串key):

import (
    "encoding/json"
    "fmt"
)

type Key struct {
    A int
    B string
}

func main() {
    originalMap := make(map[Key]string)
    key := Key{A: 1, B: "example"}
    originalMap[key] = "value"

    newMap := make(map[string]string)
    for k, v := range originalMap {
        keyStr, _ := json.Marshal(k)
        newMap[string(keyStr)] = v
    }

    jsonData, _ := json.Marshal(newMap)
    fmt.Println(string(jsonData))
}

这段代码展示了如何将结构体key的map转换为字符串key的map,并序列化为JSON。

回到顶部