是否可以修改 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
- 1 回答
- 0 关注
- 141 浏览
添加回答
举报
0/150
提交
取消