Как динамически выбрать тип структуры для отмены маршалинга json, чтобы - PullRequest
0 голосов
/ 02 марта 2020

Моя цель состоит в том, чтобы динамически выбирать тип структуры для демаршалирования json в. Если я использую указатель на struct - он работает нормально и анализирует json для структурирования, как и ожидалось, но если я использую struct, а затем получаю указатель на него и выполняю unmarshal, он отменяет маршалинг для отображения интерфейса [string] {} вместо struct.

Что я делаю не так?

https://play.golang.org/p/AkaCt_f69GV

package main

import (
    "fmt"
    "encoding/json"
)

type Person struct {
    Name string
}

var source = []byte(`{"Name":"Dan"}`)

func main() {
    parse1()
    parse2()
}

func parse1() {
    var value interface{}
    value = new(Person)

    json.Unmarshal(source, value)
    // {Dan}
    fmt.Println(*(value.(*Person)))
}

func parse2() {
    var value interface{}
    value = Person{}

    json.Unmarshal(source, &value)
    // map[Name:Dan]
    fmt.Println(value)
}

1 Ответ

3 голосов
/ 02 марта 2020

В parse2 декодер игнорирует значение Person, поскольку оно не адресуется. Декодер декодирует до значения interface{}, потому что оно адресуемое.

Исправьте проблему, передав адресу Person функции.

Используйте этот код:

func parse2() {
    var value interface{}
    value = &Person{}  // add & on this line

    json.Unmarshal(source, &value)
    fmt.Println(value)
}

или этот код:

func parse2() {
    var value interface{}
    value = &Person{}  // add & on this line

    json.Unmarshal(source, value) // remove & on this line
    fmt.Println(value)
}
...