如何在go中忽略根JSON元素?

时间:2014-01-01 19:48:17

标签: go

我想将以下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"]

2 个答案:

答案 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)
}

<强>输出

  

地图[名称:值]

Playground