json - 将 interface{} 直接转换为 Golang 中的 int,其中 interface 将数字存储为字符串

标签 json go go-interface

我得到了一个 map[string]interface{} 因为解码为 JSON;对于普通数据,接口(interface)大多数只是一个数字,但类型为字符串,如下所示:

var a interface{}
a="3"

然后所有数据将存储到一个结构中。

type someStruct struct {
   ID string
   Number1 int
   Number2 int
   Number3 int
   Number4 int
}

所以我需要将接口(interface)转换为 int,但不能轻松高效地完成,因为只有代码是 https://play.golang.org/p/oktbvTUbk93 ,非常烦人,如果您考虑到我应该处理所有可能的错误这一事实,代码似乎不可读

我想将它直接转换为 int,我一直在寻找解决方案,但任何这种转换都可以按我的意愿工作 https://play.golang.org/p/Dw67U6kZwHC

如果你想知道为什么我不直接将它解码成结构体,那是因为它是动态数据,实际解码是这样发生的:

type dataIn struct {
   Code int         `json:"code"`
   ID   string      `json:"id"`
   Data interface{} `json:"data"`
}

然后我根据code和id来处理Data,它们都是不同的数据结构,所以我不能直接用JSON来处理

最佳答案

创建一个辅助函数,在一个地方为您解析和验证:

func parseInt(i interface{}) (int, error) {
    s, ok := i.(string)
    if !ok {
        return 0, errors.New("not string")
    }
    return strconv.Atoi(s)
}

您可以在需要的地方使用它。这是一个完整的示例,其中我还使用了另一个辅助函数,它负责错误处理:

m := map[string]interface{}{
    "number1": "1",
    "number2": "2",
    "number3": "3",
    "number4": "4",
    "ID":      "asdsa",
    "Title":   "asdas",
}

getInt := func(key string) int {
    n, err := parseInt(m[key])
    if err != nil {
        panic(err) // Decide what you wanna do with error
    }
    return n
}

// converting to struct
data := element{
    ID:      m["ID"].(string),
    Title:   m["Title"].(string),
    Number1: getInt("number1"),
    Number2: getInt("number2"),
    Number3: getInt("number3"),
    Number4: getInt("number4"),
}

fmt.Printf("%+v\n", data)

上面的输出(在 Go Playground 上尝试):

{ID:asdsa Title:asdas Number1:1 Number2:2 Number3:3 Number4:4}

另请注意开源包github.com/icza/dyno应该可以帮助您轻松处理动态对象。 (披露:我是作者。)它有一个 dyno.GetInteger() 函数,例如,它能够从多种类型中提取 int64 值(例如作为整数、 float 、字符串等)。

关于json - 将 interface{} 直接转换为 Golang 中的 int,其中 interface 将数字存储为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49569791/

相关文章:

javascript - 为什么当我将某些内容插入 JSON 数组时没有任何反应?

python - 如何从 SEC Edgar python 和 json 获取数据

elasticsearch - filebeat 如何检查文件中的新内容?

json - 尝试使用 r 中的 jsonlite 将数据框转换为分层 json 数组

java - Spring Jackson 通过 Id 引用现有对象反序列化对象

go - "go get"卡在某个库上

go - 是否有可能触发 "invalid memory address or nil pointer dereference"的错误?

pointers - 混淆函数参数中的指针、 slice 和接口(interface){}

string - 这两个err值有什么区别?

go - 类型转换接口(interface) slice