为了账号安全,请及时绑定邮箱和手机立即绑定

序列化反序列化从 Go int64/uint64 从/到 Javascript 字符串

序列化反序列化从 Go int64/uint64 从/到 Javascript 字符串

Go
四季花海 2022-09-19 21:31:23
是否可以修改 json 序列化和反序列化,以便像这样构建:type Foo struct {   A int64   B uint64   // and other stuff with int64 and uint64 and there's a lot of struct that are like this}x := Foo{A: 1234567890987654, B: 987654321012345678}byt, err := json.Marshal(x)fmt.Println(err)fmt.Println(string(byt))//                                 9223372036854775808      9223372036854775808err = json.Unmarshal([]byte(`{"A":"12345678901234567", "B":"98765432101234567"}`), &x)// ^ must be quoted since javascript can't represent those values properly (2^53)// ^ json: cannot unmarshal string into Go struct field Foo.A of type int64fmt.Println(err)fmt.Printf("%#v\n", x)// main.Foo{A:1234567890987654, B:0xdb4da5f44d20b4e}https://play.golang.org/p/dHN-FcJ7p-N因此,它可以接收 json 字符串,但解析为 int64/uint64,并且可以将 int64/uint64 反序列化为 json 字符串,而无需修改结构或结构标记
查看完整描述

1 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

使用 JSON 结构标记中的字符串选项。它正是为以下用例而设计的:


“字符串”选项表示字段以 JSON 格式存储在 JSON 编码字符串中。它仅适用于字符串、浮点、整数或布尔类型的字段。在与 JavaScript 程序通信时,有时会使用这种额外的编码级别


type Foo struct {

    A int64  `json:"A,string"`

    B uint64 `json:"B,string"`

}


func main() {

    x := &Foo{}

    _ = json.Unmarshal([]byte(`{"A":"12345678901234567", "B":"98765432101234567"}`), x)


    fmt.Println(x) // &{12345678901234567 98765432101234567}


    b, _ := json.Marshal(x)


    fmt.Println(string(b)) // {"A":"12345678901234567","B":"98765432101234567"}

}

游乐场: https://play.golang.org/p/IfpcYOlcKMo


如果您无法修改现有的结构标签(但您的示例没有),则必须在自定义和方法中重新发明此标签选项的实现。stringUnmarshalJSONMarshalJSON 


查看完整回答
反对 回复 2022-09-19
  • 1 回答
  • 0 关注
  • 141 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信