首页 > 解决方案 > 如何将 json 解组为 Go 结构映射?

问题描述

我是 Go 新手,我很难处理 json 文件。我有 JSON 数据,我想将其转换为 map[string]*SomeStruct 类型的地图

示例 JSON:

{
        "Component": 
        {
                "fieldName": "component.name", 
                "fieldType": "STR" 
        },
        "Collection": {     
                "fieldName": "collection", 
                "fieldType": "INT"
        },
        "OldgenUse" : {     
                "fieldName" : "oldgen.use",         
                "fieldType": "INT"      
        },
    
}

我想阅读 JSON 并构建这样的地图:

    expcMetadata := map[string]*FieldMap{
            "Component":    {FieldName: "component.name", FieldType: "STR"},
            "Collection":   {FieldName: "collection", FieldType: "INT"},
            "OldGenUse":    {FieldName: "oldgen.use", FieldType: "INT"},
}

我能够解组为 map[string]interface{}。如何解组为 map[string]*FieldMap

我的代码给了我一张空地图:

type FieldMap struct {
    FieldName string `json:"fieldName"`
    FieldType        string `json:"fieldType"`
}

type JSONType struct {
    FieldSet map[string]FieldMap `json:"fields"`
}
func main() {

    jsonFile, er := os.Open("fields.json")
    if er != nil {
        fmt.Println(er)
    }
    fmt.Println("Successfully Opened users.json")
    defer jsonFile.Close()

    byteValue, _ := ioutil.ReadAll(jsonFile)

    // var m map[string]interface{}
    var m JSONType
    err := json.Unmarshal(byteValue, &m)
    if err != nil {
        log.Fatal(err)
    }
    
    fmt.Println(m)

} 

如果有人可以帮助我解决这个问题,我将不胜感激。

标签: jsongo

解决方案


您的输入 JSON 是一个对象,因此直接将其编组到地图中。包装器JSONType是不必要的。

var m map[string]FieldMap
err := json.Unmarshal(byteValue, &m)
if err != nil {
    log.Fatal(err)
}

在Go Playground上查看一个工作示例,输出为:

map[Collection:{collection INT} Component:{component.name STR} OldgenUse:{oldgen.use INT}]

推荐阅读