Go 展平结构并将其转换为map[string]字符串

Go 展平结构并将其转换为map[string]字符串,go,Go,我有各种不同的嵌套结构,例如: type MyInnerType struct { hello int } type MyType struct { foo string bar MyInnerType } x = &MyType{ foo: "hi" bar: MyInnerType{hello: 1} } 使用这样的声明,例如: type MyInnerType struct { hello int } type MyT

我有各种不同的嵌套结构,例如:

type MyInnerType struct {
    hello int
}

type MyType struct {
    foo   string
    bar   MyInnerType
}
x = &MyType{
    foo: "hi"
    bar: MyInnerType{hello: 1}
}
使用这样的声明,例如:

type MyInnerType struct {
    hello int
}

type MyType struct {
    foo   string
    bar   MyInnerType
}
x = &MyType{
    foo: "hi"
    bar: MyInnerType{hello: 1}
}
我想将其转换为
map[string]string
的扁平映射,如下所示:

{"foo":"hi", "hello":"1"}
我认为这必须以递归方式进行,但将各种值转换为
字符串
也是一个问题。我发现这有助于解决这个问题,但还没有找到任何解决方案


有这样的图书馆吗?如果没有,我能为自己做些什么来解决这个问题?

有很多方法可以将这些类型(或类似形状的类型)转换为所需的JSON

最简单的方法是如下所示重新定义结构,然后默认的JSON封送拆收器将执行您想要的操作:

type MyInnerType int

type MyType struct {
  Foo string      `json:"foo"`
  Bar MyInnerType `json:"hello"`
}
如果确实希望保留定义的结构,则可以通过如下方法实现自定义JSON封送拆收器:

type MyInnerType struct {
  hello int
}

func (mit MyInnerType) MarshalJSON() ([]byte, error) {
  return []byte(strconv.Itoa(mit.hello)), nil
}

type MyType struct {
  Foo string      `json:"foo"`
  Bar MyInnerType `json:"hello"`
}

func main() {
  x := &MyType{
    Foo: "hi",
    Bar: MyInnerType{hello: 1},
  }
  bs, err := json.Marshal(x)
  if err != nil {
    panic(err)
  }
  fmt.Println(string(bs))
  // {"foo":"hi","hello":1}
}

“标准库中没有任何东西可以为您这样做。@阿德里安,补充了一个问题,很抱歉不清楚。要求我们推荐或查找一本书、工具、软件库、教程或其他非现场资源的问题对于堆栈溢出来说是离题的,因为它们往往会吸引固执己见的答案和垃圾邮件。我非常好奇,你为什么要这么做。您将丢失有关数据类型的所有信息,当进一步处理数据时,您将丢失go type系统在类型安全和类型检查中提供的所有信息。如果你想要的是json,maerics有你在下面寻找的答案。