有没有办法读取具有不同结构的JSON文件,并以更动态的方式将读取数据转换为正确的结构?
的Structs:
type Person struct {
Name string `json:"name,omitempty"`
Age int64 `json:"age,omitempty"`
}
type Pet struct {
Name string `json:"name,omitempty"`
Age int64 `json:"age,omitempty"`
}
目前,他们从以下文件中读取:
func ReadFileToByteArray(filepath string) ([]byte, error) {
var err error
err = os.MkdirAll(path.Dir(filepath), os.FileMode(0700))
if err != nil {
panic(err)
}
_, err = os.Stat(filepath)
if err != nil {
if os.IsNotExist(err) {
file, err := os.Create(filepath)
if err != nil {
panic(err)
}
defer file.Close()
file.Write([]byte("[]"))
} else {
panic(err)
}
}
readbytes, err := ioutil.ReadFile(filepath)
if err != nil {
panic(err)
}
return readbytes, err
}
作为转换数组读取:
func GetPersonArrayFromFile(fn string) (data []Person) {
readbytes, err := ReadFileToByteArray(fn)
if err != nil {
panic(err)
}
err = json.Unmarshal(readbytes, &data)
if err != nil {
log.Fatal(fmt.Sprintf("Filename: %[1]s Error: %[2]s (%[2]T)", fn, err))
panic(err)
}
return data
}
func GetPetArrayFromFile(fn string) (data []Pet) {
readbytes, err := ReadFileToByteArray(fn)
if err != nil {
panic(err)
}
err = json.Unmarshal(readbytes, &data)
if err != nil {
log.Fatal(fmt.Sprintf("Filename: %[1]s Error: %[2]s (%[2]T)", fn, err))
panic(err)
}
return data
}
当前尝试(简化):
func main() {
personsJSON := `[{"name": "foo", "age": 22}, {"name": "bar", "age": 33}]`
petsJSON := `[{"name": "bunny bunnieface", "age": 1}, {"name": "you there", "age": 5}]`
var t []Person
data := Get([]byte(personsJSON), t)
var t2 []Pet
data2 := Get([]byte(petsJSON), t2)
fmt.Println("%v", data)
fmt.Println("%v", data2)
}
// Return given type
func Get(b []byte, t []struct{}) []struct{} {
err := json.Unmarshal(b, &t)
if err != nil {
panic(err)
}
return t
}
这给出了:
cannot use t (type []Person) as type []struct {} in argument to Get
这可以实现,因为没有通用或者有不同的方法吗?