不懂就问: go 里面如何自定义外部类型的 json 序列化方式?

2022-06-17 14:52:32 +08:00
 x97bgt

我要 json 序列化一个外部类型的变量,把所有 int 类型变量都序列化成"010101"这种表示。

类似 Java 里的 Gson ,想把自定义的 int 序列化逻辑注册进去。

这要怎么做到?

2504 次点击
所在节点    Go 编程语言
25 条回复
x97bgt
2022-06-17 21:34:45 +08:00
@icexin 代码很贴心,投币感谢了!
joesonw
2022-06-18 00:20:43 +08:00
你想要的是类似 swift 的 extension ,任意地方可以扩展一个类的方法。这样的坏处是 implicitity ,你用了一堆库,某个库把另一个库的 MashalJSON 给改了,你得到的结果就是一头雾水,明明自己没改呀。
x97bgt
2022-06-19 11:42:09 +08:00
@joesonw
这个看设计,因为 go 里面的序列化器都是全局的,所以改一个地方就会影响好多个地方。

像 java 的 Gson 就不会,用的时候新建一个 instance 然后注册进逻辑就可以,只有使用它的地方才带这个逻辑。
lysS
2022-06-19 15:06:09 +08:00
你说的自定义 json 序列化方式是加 tag 吗?

你可以自定义一个自己的完全一样的 struct
type MyPerson struct {
name string `我的自定义 tag`
age int
home Home
}

然后把 p 强制类型转换后再序列化

json.Marshal(MyPerson(p))
x97bgt
2022-06-20 14:51:34 +08:00
@lysS 不是。我说的是把'{"name": "Alice", "age": 10, "home": {"district": "XX", "number": 1}}',变成'{"name": "Alice", "age": "1010", "home": {"district": "XX", "number": "01"}}'这样,就是把里面所有的 int 数值类型全部换一个序列化方式。

是需要引入中间变量

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/860295

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX