Here is the codeUnmarshal sul valore riflette
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)
}
In funzione 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)
}
non riesco a unmarshal il json nel tipo oggetto sottostante.
Cosa c'è di sbagliato qui? Sono così bloccato qui. Qualcosa di molto semplice ma così difficile da capire.
Grazie
UPDATE :: Obiettivo di questo problema è quello di prelevare un oggetto completamente formato di tipo passata in funzione Get.
L'approccio menzionato da Nick nel commento riportato di seguito non mi consente di ottenere l'oggetto effettivo che ho già provato in precedenza. Posso comunque recuperare i dati (anche quando l'oggetto ha oggetti ricorsivi sotto) in una mappa come questo
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)
}
Tuttavia ho bisogno l'oggetto reale di nuovo non solo i dati. Qualcosa come user := &User{"SomeName"}
dove ho bisogno di user
oggetto da Unmarshall. Il trucco è da qualche parte nel riflesso ma non so come.
Riflettere non farà quello che sembra pensarlo. Non puoi costruire un oggetto arbitrario usandolo. Potresti probabilmente intrappolare qualcosa usando riflessi e non sicuri, ma in realtà dovresti ripensare a ciò che stai cercando di fare. –
Grazie sto chiudendo questa discussione. Grazie per aver dedicato tempo. Ha fatto +1 sulle tue risposte – Minty