如何解决如何使用结构的类型而不是go中的标签来重新编组结构?
我想将结构重新编组为json,并使用结构中定义的类型作为输出。 结构:
type A struct{
B []B //edit: fields have to be exported to work
}
type B struct{
X string `json:"x"` //edit: fields have to be exported to work
Y float64 `json:"y,string"` //edit: fields have to be exported to work
Z float64 `json:"z,string"` //edit: fields have to be exported to work
如果取消对这些结构的编组,则可以得到B.y作为float64,这与预期的一样。但是,如果我再次将其重新编组为JSON,则会得到解组的JSON,其中y和z为字符串,但我想将其作为float64来获取。我必须添加',string'部分,因为API在JSON响应中以字符串形式返回所有内容(请参见下面的示例)。我是否必须编写一个自定义的编组函数来执行此操作,还是可以仅将json标记添加到结构定义中?
示例响应和重新编排的json:
{
"A": [
{
"x": "test1","y": "1.00","z": "1.01"
},{
"x": "test2","y": "2.00","z": "2.01"
}
]
}
预期的已重组JSON:
{
"A": [
{
"x": "test1","y": 1.00,"z": 1.01
},"y": 2.00,"z": 2.01
}
]
}
解决方法
您根本无法封送或取消封送这些字段,因为这些字段未导出。但是要做您要描述的事情,只需将其转换为没有(或不同)struct标记的等效类型。因为它是一个嵌套切片,所以您必须对其进行迭代。
func main() {
a := A{}
err := json.Unmarshal(corpus,&a)
if err != nil {
panic(err)
}
c := C{}
for _,b := range a.B {
c.B = append(c.B,D(b))
}
payload,_ := json.Marshal(c)
fmt.Println(string(payload))
}
type A struct {
B []B
}
type B struct {
X string `json:"x"`
Y float64 `json:"y,string"`
Z float64 `json:"z,string"`
}
type C struct {
B []D
}
type D struct {
X string `json:"x"`
Y float64 `json:"y"`
Z float64 `json:"z"`
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。