Here is the codeunmarshal na odzwierciedlenie wartości
package main
import (
"fmt"
"encoding/json"
"reflect"
)
var (
datajson []byte
//ref mapp
)
type mapp map[string]reflect.Type
type User struct {
Name string
//Type map[string]reflect.Type
}
func MustJSONEncode(i interface{}) []byte {
result, err := json.Marshal(i)
if err != nil {
panic(err)
}
return result
}
func MustJSONDecode(b []byte, i interface{}) {
err := json.Unmarshal(b, i)
if err != nil {
panic(err)
}
}
func Store(a interface{}) {
datajson = MustJSONEncode(a)
//fmt.Println(datajson)
}
func Get(a []byte, b interface{}) {
objType := reflect.TypeOf(b).Elem()
obj := reflect.New(objType)
//fmt.Println(obj)
MustJSONDecode(a, &obj)
fmt.Printf("%s", obj)
}
func main() {
dummy := &User{}
david := User{Name: "DavidMahon"}
Store(david)
Get(datajson, dummy)
}
w funkcji Get
func Get(a []byte, b interface{}) {
objType := reflect.TypeOf(b).Elem()
obj := reflect.New(objType)
//fmt.Println(obj)
MustJSONDecode(a, &obj)
fmt.Printf("%s", obj)
}
jestem w stanie unmarshal JSON do bazowego typu obiektu.
Co jest nie tak? Tak tu utknąłem. Coś bardzo prostego, ale trudnego do wymyślenia.
Dzięki
UPDATE :: Cel tego problemu jest retreive w pełni uformowany obiekt typu przekazany w funkcji GET.
Podejście, o którym wspomniał Nick w komentarzu poniżej, nie dostarcza mi faktycznego obiektu, którego wcześniej próbowałem. Mogę jakikolwiek pobierania danych (nawet wtedy, gdy obiekt ma rekurencyjne obiekty pod spodem) w mapie jak ten
func Get(a []byte) {
var f interface{}
//buf := bytes.NewBuffer(a)
//v := buf.String()
//usr := &User{}
MustJSONDecode(a, &f)
fmt.Printf("\n %v \n", f)
}
Jednak muszę rzeczywisty obiekt z powrotem nie tylko dane. Coś takiego jak user := &User{"SomeName"}
, gdzie potrzebuję obiektu z powrotem z Unmarshall. Sztuczka jest gdzieś w odbiciu, ale nie wiem jak.
Reflect nie zrobi tego, o czym myślisz, że tak będzie. Nie możesz skonstruować dowolnego obiektu za jego pomocą. Prawdopodobnie mógłbyś coś połączyć ze sobą za pomocą odbicia i niebezpieczeństwa, ale naprawdę powinieneś przemyśleć to, co próbujesz zrobić. –
Dzięki, zamykam ten wątek. Dzięki za poświęcenie czasu. Daje +1 Twoim odpowiedziom. – Minty