在go

时间:2018-03-04 21:02:39

标签: go dynamic

有没有办法读取具有不同结构的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

这可以实现,因为没有通用或者有不同的方法吗?

https://play.golang.org/p/QEHEuqi92Wt

0 个答案:

没有答案