Голанг Джсон Разрушение структуры, содержащей интерфейс {} - PullRequest
0 голосов
/ 07 октября 2018

У меня есть требование json unmarshal к структуре, содержащей интерфейс {}.Внутренний тип известен только во время выполнения, поэтому структура определяется с помощью интерфейса {}.Тем не менее, тип заполняется правильно, прежде чем перейти к json.Unmarshal.Но json.Unmarshal всегда заполняет результирующую структуру map [] вместо заданного типа.Как мне решить эту проблему, чтобы получить правильное демаршальное поведение здесь.

См. Простой тестовый код и поведение здесь:

package main

import (
    "fmt"
//  s "strings"
    "encoding/json"
)

type one struct {
    S       string  `json:"status"` 

    Res interface{} `json:"res"`    
}

type two struct {
    A   string
    B   string
}

func main() {
    t   := []two {{A:"ab", B:"cd",}, {A:"ab1", B:"cd1",}}
    o   := one {S:"s", Res:t}

    js, _ := json.Marshal(&o)
    fmt.Printf("o: %+v\n", o)

    fmt.Printf("js: %s\n", js)

    er := json.Unmarshal(js, &o)
    fmt.Printf("er: %+v\n", er)

    fmt.Printf("o: %+v\n", o)

}

Результат:

o: {S:s Res:[{A:ab B:cd} {A:ab1 B:cd1}]}
js: {"status":"s","res":[{"A":"ab","B":"cd"},{"A":"ab1","B":"cd1"}]}
er: <nil>
o: {S:s Res:[map[A:ab B:cd] map[B:cd1 A:ab1]]}

См. Код здесь 1

1 Ответ

0 голосов
/ 07 октября 2018

Вы можете создать вспомогательный тип one, который содержит ожидаемый тип.Преобразование из этого вспомогательного типа обратно в обычный one тип.

т.е. ( play link ):

package main

import (
    "fmt"
    //  s "strings"
    "encoding/json"
)

type one struct {
    S string `json:"status"`

    Res interface{} `json:"res"`
}

type two struct {
    A string
    B string
}

type oneStatic struct {
    S   string `json:"status"`
    Res []two  `json:"res"`
}

func main() {
    t := []two{{A: "ab", B: "cd"}, {A: "ab1", B: "cd1"}}
    o := one{S: "s", Res: t}

    js, _ := json.Marshal(&o)
    fmt.Printf("o: %+v\n", o)

    fmt.Printf("js: %s\n", js)

    var oStatic oneStatic
    er := json.Unmarshal(js, &oStatic)
    fmt.Printf("er: %+v\n", er)

    o = one{oStatic.S, oStatic.Res}
    fmt.Printf("o: %+v\n", o)

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...