@[matt....@gmail.com] deserves a beer, I really needed to unmarshal to an interface
On Thursday, 14 May 2020 at 22:58:48 UTC+3 Saied Seghatoleslami wrote: > I have tried unmarshalling various JSON and XML files with limited > success. So I ended up writing a "lexer" along the lines of Rob Pike's > lecture in Australia. I have had good success with it in a bunch of > projects. I would be very interested to get some comments on what the > community thinks of decoding XML, JSON and similarly encoded objects in > this way. https://github.com/Saied74/lexer2 > > > On Thursday, August 20, 2015 at 12:52:45 PM UTC-4, hajd...@gmail.com > wrote: >> >> Is there any reason this *shouldn't* work? ( I realize it doesn't, just >> curious since you can marshal an empty interface ). >> >> A contrived example: ( https://play.golang.org/p/s-Lh0qDwAP) >> >> type Person struct { >> XMLName xml.Name `xml:"person"` >> FirstName string `xml:"firstname"` >> Parents interface{} `xml:"parent"` >> } >> >> func main() { >> type Parent struct { >> FirstName string `xml:"name"` >> LastName string `xml:"lastname"` >> } >> p := &Person{FirstName: "Steve"} >> p.Parents = []Parent{Parent{"Jack","Doe"}, Parent{"Lynne","Doe"}} >> data, err := xml.Marshal(p) >> if err != nil { >> fmt.Println(err) >> } >> fmt.Println("Marshalled:",string(data)) >> p2 := &Person{} >> p2.Parents = []Parent{} >> err = xml.Unmarshal(data, p2) >> if err != nil { >> fmt.Println(err) >> } >> fmt.Println("Unmarshalled:", p2) >> } >> >> >> I get that by being an empty interface{}, there are no fields that are >> exported for it to look at. Except that I'm assigning a concrete type to >> the interface{}, so shouldn't Unmarshal be able to reflect that interface{} >> and find the struct/tag names to Unmarshal the data? I'm assuming ( and >> guessing I'm wrong ) that that's how Marshal does it? I think I'd probably >> be less confused if Marshal wasn't working as well, but I don't get why >> Marshal can deal with a interface{} and Unmarshal can't. >> >> The real use case I have being that the XML response I'm getting has some >> static elements and then it has dynamic elements: >> >> <api> >> <staticfield1>data</staticfield1> >> <staticfield2>data</staticfield2> >> <record> >> <fieldname1>data</fieldname1> >> <fieldname2>data</fieldname2> >> </record> >> <record> >> .. >> </record> >> </api> >> >> I have the static fields in a struct, but fieldname's returned in the >> record elements change, depending on which database table is being returned >> by the api. I want to be able to create a record struct that matches what >> I know the record will look like for each call, and then compose the whole >> struct ( static fields + the dynamic fields ) that I'm unmarshalling into. >> >> The solution I have right now is to have a byte array that captures the >> innerxml and then unmarshal that separately, but I felt like this would be >> a cleaner solution. ( https://play.golang.org/p/z3BS6tjqgW ) >> >> If there isn't anyway to do this - is there anyway to grab a whole >> <parent> record, with the <parent></parent> tags included? My byte >> solution works, but the issue I run into is that my innerxml field just >> ends up with <FirstName></FirstName><LastName></LastName>, with no >> surrounding <parent> tags. So I have to add the parent tags back so that I >> can unmarshal to a Parent struct, as you can see in the example. >> >> Any help appreciated! >> >> Steve >> > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/9355c6f8-fc0c-4828-a055-5f056dd0bb9dn%40googlegroups.com.