Let's say I have an application that receives json data in two different formats.
f1 = `{"pointtype":"type1", "data":{"col1":"val1", "col2":"val2"}}`
f2 = `{"pointtype":"type2", "data":{"col3":"val3", "col3":"val3"}}`
And I have a struct associated to each type:
type F1 struct {
col1 string
col2 string
}
type F2 struct {
col3 string
col4 string
}
Assuming that I use the encoding/json
library to turn the raw json data into the struct:
type Point {
pointtype string
data json.RawMessage
}
How can I decode the data into the appropiate struct just by knowing the pointtype?
I was trying something along the lines of :
func getType(pointType string) interface{} {
switch pointType {
case "f1":
var p F1
return &p
case "f2":
var p F2
return &p
}
return nil
}
Which is not working because the returned value is an interface, not the proper struct type. How can I make this kind of switch struct selection work?
here is a non working example
You can type switch on the interface returned from your method:
switch ps := parsedStruct.(type) {
case *F1:
log.Println(ps.Col1)
case *F2:
log.Println(ps.Col3)
}
..etc. Remember, for the encoding/json
package to decode properly (via reflection), your fields need to be exported (uppercase first letter).
Working sample: http://play.golang.org/p/8Ujc2CjIj8
An alternative way would be to use maps (supported by the native json package).
Here I assume that each data attribute (col1, col2 ...) exists, but maps allows you to check it.
package main
import "fmt"
import "encoding/json"
type myData struct {
Pointtype string
Data map[string]string
}
func (d *myData) PrintData() {
if d.Pointtype == "type1" {
fmt.Printf("type1 with: col1 = %v, col2 = %v\n", d.Data["col1"], d.Data["col2"])
} else if d.Pointtype == "type2" {
fmt.Printf("type2 with: col3 = %v, col4 = %v\n", d.Data["col3"], d.Data["col4"])
} else {
fmt.Printf("Unknown type: %v\n", d.Pointtype)
}
}
func main() {
f1 := `{"pointtype":"type1", "data":{"col1":"val1", "col2":"val2"}}`
f2 := `{"pointtype":"type2", "data":{"col3":"val3", "col4":"val4"}}`
var d1 myData
var d2 myData
json.Unmarshal([]byte(f1), &d1)
json.Unmarshal([]byte(f2), &d2)
d1.PrintData()
d2.PrintData()
}
http://play.golang.org/p/5haKpG7MXg
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With