我想将以下JSON序列化为map [string]字符串,其中包含map [“Name”] ==“Value”
{
"Item": {
"tags": {
"Name": "Value"
}
}
}
但是,我不想为“item”创建一个带有一个字段的支柱。是否可以忽略类似于Java / Jackson的根JSON元素:mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
我到目前为止最好的是:
items := make(map[string]map[string]string)
items := items["Item"]
答案 0 :(得分:4)
我会做一个小帮手,它会跳过结构的根部:
func SkipRoot(jsonBlob []byte) json.RawMessage {
var root map[string]json.RawMessage
if err := json.Unmarshal(jsonBlob, &root); err != nil {
panic(err)
}
for _, v := range root {
return v
}
return nil
}
然后像这样使用它:
json.Unmarshal(SkipRoot(jsonBlob), &items)
此处的完整示例:Playground
答案 1 :(得分:1)
不幸的是,没有。
encoding/json
包没有任何允许您忽略根元素的功能。最简单的方法是使用你提到的那些不需要的结构:
type Root struct {
Item Item
}
type Item struct {
Tags map[string]string
}
以下是一个完整的工作示例:
package main
import (
"encoding/json"
"fmt"
)
type Root struct {
Item Item
}
type Item struct {
Tags map[string]string
}
var data = []byte(`{
"Item": {
"tags": {
"Name": "Value"
}
}
}`)
func main() {
var s Root
if err := json.Unmarshal(data, &s); err != nil {
panic(err)
}
tags := s.Item.Tags
fmt.Printf("%+v", tags)
}
<强>输出强>
地图[名称:值]