Без использования какой-либо внешней библиотеки вы можете сделать:
package main
import (
"encoding/json"
"fmt"
"reflect"
)
type BaseMessage struct {
MessageId string `json:"messageId"`
Type int `json:"type"`
}
type TextMessage struct {
*BaseMessage
Field1 string `json:"field1"`
Field2 string `json:"field2"`
}
type SystemTextMessage struct {
*BaseMessage
Field1 string `json:"field1"`
Field2 string `json:"field2"`
}
func parseJson(input []byte) []interface{} {
var raw []map[string]interface{}
json.Unmarshal(input, &raw)
var elements []interface{}
for _, element := range raw {
typeId := int(element["type"].(float64))
base := &BaseMessage{
MessageId: element["messageId"].(string),
Type: typeId,
}
switch typeId {
case 1:
elements = append(elements, &TextMessage{base, element["field1"].(string), element["field2"].(string)})
break
case 2:
elements = append(elements, &SystemTextMessage{base, element["field1"].(string), element["field2"].(string)})
break
}
}
return elements
}
func main() {
input := []byte(`
[{
"messageId": "text",
"type": 1,
"field1": "field 1",
"field2": "field 2"
}, {
"messageId": "system",
"type": 2,
"field1": "field 1",
"field2": "field 2"
}]
`)
for _, element := range parseJson(input) {
fmt.Println(reflect.TypeOf(element))
}
}
Вы можете попробовать здесь: https://play.golang.org/p/hB8qG6oflhR
Будьте внимательны, код не обрабатывает ошибки.
Я не уверен, есть ли более автоматический способ сделать это, но я считаю, что вам нужно работать с голым interface{}
здесь.