gpt4 book ai didi

json - Golang Json 解压缩到包含接口(interface){}的结构

转载 作者:IT王子 更新时间:2023-10-29 02:36:15 26 4
gpt4 key购买 nike

我对包含接口(interface){} 的结构有 json 解码要求。内部类型只在运行时才知道,因此该结构是用接口(interface){}定义的。但是,在传递给 json.Unmarshal 之前,类型已正确填充。但是 json.Unmarshal 总是用 map[] 而不是给定的类型填充结果结构。我如何解决此问题以在此处获得正确的解码行为。

在这里查看简单的测试代码和行为:

package main

import (
"fmt"
// s "strings"
"encoding/json"
)

type one struct {
S string `json:"status"`

Res interface{} `json:"res"`
}

type two struct {
A string
B string
}

func main() {
t := []two {{A:"ab", B:"cd",}, {A:"ab1", B:"cd1",}}
o := one {S:"s", Res:t}

js, _ := json.Marshal(&o)
fmt.Printf("o: %+v\n", o)

fmt.Printf("js: %s\n", js)

er := json.Unmarshal(js, &o)
fmt.Printf("er: %+v\n", er)

fmt.Printf("o: %+v\n", o)

}

结果:

o: {S:s Res:[{A:ab B:cd} {A:ab1 B:cd1}]}
js: {"status":"s","res":[{"A":"ab","B":"cd"},{"A":"ab1","B":"cd1"}]}
er: <nil>
o: {S:s Res:[map[A:ab B:cd] map[B:cd1 A:ab1]]}

请在此处查看代码 1

最佳答案

您可以创建一个包含预期类型的​​辅助 one 类型。从该辅助类型转换回常规 one 类型。

即( play link ):

package main

import (
"fmt"
// s "strings"
"encoding/json"
)

type one struct {
S string `json:"status"`

Res interface{} `json:"res"`
}

type two struct {
A string
B string
}

type oneStatic struct {
S string `json:"status"`
Res []two `json:"res"`
}

func main() {
t := []two{{A: "ab", B: "cd"}, {A: "ab1", B: "cd1"}}
o := one{S: "s", Res: t}

js, _ := json.Marshal(&o)
fmt.Printf("o: %+v\n", o)

fmt.Printf("js: %s\n", js)

var oStatic oneStatic
er := json.Unmarshal(js, &oStatic)
fmt.Printf("er: %+v\n", er)

o = one{oStatic.S, oStatic.Res}
fmt.Printf("o: %+v\n", o)

}

关于json - Golang Json 解压缩到包含接口(interface){}的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52684286/

26 4 0
文章推荐: arrays - pq: 函数 unnest(unknown) 不是唯一的
文章推荐: C# XML 序列化 - 如何序列化继承 List 的类中的属性?