繁体   English   中英

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

[英]How can I ignore root JSON Element in 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"]

我会做一个小助手,跳过围绕以下几行的结构的根:

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)

这里有完整的例子: 游乐场

很不幸的是,不行。
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)
}

产量

图[名称:值]

操场

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM