Go语言 如何将JSON转换为struct

3mpgtkmj  于 2023-08-01  发布在  Go
关注(0)|答案(3)|浏览(167)

我调用第三方API,得到以下JSON:

{"amount":1.0282E+7}

字符串
当我想转换它时,我得到了一个错误:
Blocjson:无法将数字1.0282E+7解组到Go结构字段MiddleEastAccountToCardResponse中。int64类型的金额
我想在Go中将这个JSON转换为以下结构:

type Response struct {
    Amount int64 `json:"amount"`
}

fhity93d

fhity93d1#

既然你没有解释你想要的确切结果,我们只能猜测。但是你有三种通用的方法来实现这一点:
1.解封为浮点类型而不是整数类型。如果你需要一个int,你可以稍后转换成一个int。
1.解封为json.Number类型,该类型保留完整的JSON表示及其精度,并且可以根据需要转换为int或float。
1.使用自定义的解组器,它可以为您从float类型转换为int类型。
所有这三个都在这里演示:

package main

import (
    "fmt"
    "encoding/json"
)

const input = `{"amount":1.0282E+7}`

type ResponseFloat struct {
    Amount float64 `json:"amount"`
}

type ResponseNumber struct {
    Amount json.Number `json:"amount"`
}

type ResponseCustom struct {
    Amount myCustomType `json:"amount"`
}

type myCustomType int64

func (c *myCustomType) UnmarshalJSON(p []byte) error {
    var f float64
    if err := json.Unmarshal(p, &f); err != nil {
        return err
    }
    *c = myCustomType(f)
    return nil
}

func main() {
    var x ResponseFloat
    var y ResponseNumber
    var z ResponseCustom
    
    if err := json.Unmarshal([]byte(input), &x); err != nil {
        panic(err)
    }
    if err := json.Unmarshal([]byte(input), &y); err != nil {
        panic(err)
    }
    if err := json.Unmarshal([]byte(input), &z); err != nil {
        panic(err)
    }
    fmt.Println(x.Amount)
    fmt.Println(y.Amount)
    fmt.Println(z.Amount)
}

字符串
See it in the playground的数据。

nwsw7zdq

nwsw7zdq2#

修改代码如下:

package main

import (
    "encoding/json"
    "fmt"
)

func main() {

    var data = []byte(`{"amount":1.0282E+7}`)
    var res Response
    json.Unmarshal(data, &res)
    fmt.Println(res)

}

type Response struct {
    Amount float64 `json:"amount"`
}

字符串
输出量:

{1.0282e+07}

ymdaylpp

ymdaylpp3#

结构体中的Amount字段是 int64,但您试图从字符串中解析的数字是 float(以科学计数法表示)。
试试这个:

type Response struct {
    Amount float64 `json:"amount"`
}

字符串

相关问题