Если []byte
действительно - это то, что вам нужно, используйте json.RawMessage
, который равен типа []byte
, но также реализует методы синтаксического анализа JSON.Я считаю, что это может быть то, что вы хотите, так как он примет все, что в конечном итоге в data
.Конечно, вам нужно вручную разобрать Data
, чтобы выяснить, что на самом деле там есть.
Один из возможных бонусов - это то, что это пропускает любой тяжелый анализ, потому что просто копирует byte
s.Если вы хотите использовать эти данные для чего-то, вы используете []interface{}
, а затем используйте переключатель типа для использования отдельных значений.
https://play.golang.org/p/og88qb_qtpSGJ
package main
import (
"encoding/json"
"fmt"
)
type Obj struct {
Id string `json:"id"`
Data json.RawMessage `json:"data"`
}
func main() {
byt := []byte(`{"id":"someID","data":["str1","str2", 1337, {"my": "obj", "id": 42}]}`)
var obj Obj
if err := json.Unmarshal(byt, &obj); err != nil {
panic(err)
}
fmt.Printf("%+v\n", obj)
fmt.Printf("Data: %s\n", obj.Data)
// use it
var d []interface{}
if err := json.Unmarshal(obj.Data, &d); err != nil {
panic(err)
}
fmt.Printf("%+v\n", d)
for _, v := range d {
// you need a type switch to deterine the type and be able to use most of these
switch real := v.(type) {
case string:
fmt.Println("I'm a string!", real)
case float64:
fmt.Println("I'm a number!", real)
default:
fmt.Printf("Unaccounted for: %+v\n", v)
}
}
}