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

是否可以修改 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      9223372036854775808

err = 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 int64

fmt.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 字符串,而无需修改结构或结构标记


四季花海
浏览 144回答 1
1回答

宝慕林4294392

使用 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 
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go