Как демаршалировать json в Go карту структур? - PullRequest
0 голосов
/ 14 июля 2020

Я новичок в Go, и мне трудно работать с json файлами. У меня есть данные JSON, которые я хочу преобразовать в карту типа map [string] * SomeStruct

Sample 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] {}. Как можно демаршалировать в карту [строка] * 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)

} 

Я был бы очень признателен, если бы кто-нибудь мог мне помочь с этим.

Ответы [ 2 ]

3 голосов
/ 14 июля 2020

Для вашей структуры JSONType в JSON нужен узел fields. Скорее вы можете использовать карту при демаршалинге.

m := make(map[string]FieldMap)
err := json.Unmarshal(byteValue, &m)
3 голосов
/ 14 июля 2020

Введенный вами 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}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...