Golang 动态解组 JSON

时间:2021-06-17 19:31:51

标签: json go refactoring

在 Go 中,给定以下函数,是否可以在运行时不知道 jsonString 的类型的情况下解组 c

func findChargedItems(fs financialService, conditions []string) ([]*models.ChargedItem, error) {
    var jsonResult []string

    f := getChargedItemsQuery(conditions)
    q, _, _ := f.ToSql()

    err := fs.db.Select(&jsonResult, q)
    if err != nil {
        return nil, err
    }

    jsonString := fmt.Sprintf("[%v]", strings.Join(jsonResult, ","))
    c := make([]*models.ChargedItem, 0)
    err = json.Unmarshal([]byte(jsonString), &c)
    if err != nil {
        return nil, err
    }

    return c, nil
}

问题是我有大量模型需要执行这个确切的过程,我正在重复自己以实现这一目标。我只想拥有一个“通用”函数 findEntities,它对 ChargedItemgetChargedItemsQuery 进行操作。我意识到我可以只为 getChargeditemsQuery 传递一个函数,这样就可以解决这个问题,但是我遇到了 json.Unmarshal 的问题,例如,当我尝试使用接口时,json 字段没有正确映射。有没有办法在不影响数据模型的情况下实现我想要做的事情?

1 个答案:

答案 0 :(得分:0)

我不确定您要做什么,但这可能不是一个好主意。在任何 率,这应该做你想要的:

package main

import (
   "encoding/json"
   "fmt"
)

func main() {
   // do what youre trying to do
   var (
      a = []byte("[10, 11]")
      b []interface{}
   )
   json.Unmarshal(a, &b)
   // then fix it later
   c := make([]float64, len(b))
   for n := range c {
      c[n] = b[n].(float64)
   }
   fmt.Println(c)
}