英文:
Golang Json Unmarshal numeric with exponent
问题
我在将json字符串解析为具有指数的数值时遇到了问题,它总是被解析为0。请检查下面的代码:
package main
import (
"encoding/json"
"fmt"
"os"
)
type Person struct {
Id uint64 `json:"id"`
Name string `json:"name"`
}
func main() {
//创建Json字符串
var b = []byte(`{"id": 1.2E+8, "Name": "Fernando"}`)
//将Json解析为正确的结构体
var f Person
json.Unmarshal(b, &f)
//打印Person结构体
fmt.Println(f)
//将结构体转换为Json
result, _ := json.Marshal(f)
//打印Json
os.Stdout.Write(result)
}
运行结果为:
{0 Fernando}
有没有办法让它正常工作?因为指数是标准的JSON表示方式,看起来是Golang解析错误。
你可以在这里的playground中查看代码:http://play.golang.org/p/8owgjX9y0m
英文:
I have problem when Unmarshal json string into struct that is the numeric value with exponent will alway be 0.
Please check code below :
package main
import (
"encoding/json"
"fmt"
"os"
)
type Person struct {
Id uint64 `json:"id"`
Name string `json:"name"`
}
func main() {
//Create the Json string
var b = []byte(`{"id": 1.2E+8, "Name": "Fernando"}`)
//Marshal the json to a proper struct
var f Person
json.Unmarshal(b, &f)
//print the person
fmt.Println(f)
//unmarshal the struct to json
result, _ := json.Marshal(f)
//print the json
os.Stdout.Write(result)
}
And the run is :
{0 Fernando}
Is there any way to make it work? Since the exponent thing is standart JSON. It seems the golang wrong interpret it.
Here the playground : http://play.golang.org/p/8owgjX9y0m
答案1
得分: 1
将Id
类型从int64
更改为float32
或float64
。
http://play.golang.org/p/-zidTD_q8y
编辑:这可能有点取巧,但你可以添加一个类型为float64
的“虚拟”Id
字段,并编写一个钩子将该值转换为实际的Id
类型int64
。
type Person struct {
Id float64 `json:"id"`
_Id int64
Name string `json:"name"`
}
var f Person
var b = []byte(`{"id": 1.2e+8, "Name": "Fernando"}`)
_ = json.Unmarshal(b, &f)
if reflect.TypeOf(f._Id) == reflect.TypeOf((int64)(0)) {
fmt.Println(f.Id)
f._Id = int64(f.Id)
}
http://play.golang.org/p/32HHLxnFlX
英文:
Change the Id
type from int64
to float32
or float64
.
http://play.golang.org/p/-zidTD_q8y
EDIT: This may be a bit of a hack, but you can add a "dummy" Id
field of type float64
and write a hook to cast the value to the actual Id
type int64
.
type Person struct {
Id float64 `json:"id"`
_Id int64
Name string `json:"name"`
}
var f Person
var b = []byte(`{"id": 1.2e+8, "Name": "Fernando"}`)
_ = json.Unmarshal(b, &f)
if reflect.TypeOf(f._Id) == reflect.TypeOf((int64)(0)) {
fmt.Println(f.Id)
f._Id = int64(f.Id)
}
答案2
得分: 1
只需将id字段的类型更改为float64。
package main
import (
"encoding/json"
"fmt"
"os"
)
type Person struct {
Id float64 `json:"id"`
Name string `json:"name"`
}
func main() {
//Create the Json string
var b = []byte(`{"id": 1.2E+8, "Name": "Fernando"}`)
//Marshal the json to a proper struct
var f Person
json.Unmarshal(b, &f)
//print the person
fmt.Println(f)
//unmarshal the struct to json
result, _ := json.Marshal(f)
//print the json
os.Stdout.Write(result)
}
英文:
just change the type of id field into float64.
package main
import (
"encoding/json"
"fmt"
"os"
)
type Person struct {
Id float64 `json:"id"`
Name string `json:"name"`
}
func main() {
//Create the Json string
var b = []byte(`{"id": 1.2E+8, "Name": "Fernando"}`)
//Marshal the json to a proper struct
var f Person
json.Unmarshal(b, &f)
//print the person
fmt.Println(f)
//unmarshal the struct to json
result, _ := json.Marshal(f)
//print the json
os.Stdout.Write(result)
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论