[提问] 刚接触 golang,想问一下为什么不能序列化 html 包里面的 Node 类型?

2020-06-07 23:00:33 +08:00
 noobCoderZzz

代码如下:

node, _ := html.Parse(response.Body)
nodeString,err := json.Marshal(node)
fmt.Println(err)

报异常如下:
json: unsupported value: encountered a cycle via *html.Node

是因为 Node 包含了*Node 类型的字段?对于这种循环嵌套的对象有办法做到序列化吗?
附 Node 的代码

type Node struct {
	Parent, FirstChild, LastChild, PrevSibling, NextSibling *Node

	Type      NodeType
	DataAtom  atom.Atom
	Data      string
	Namespace string
	Attr      []Attribute
}
3085 次点击
所在节点    Go 编程语言
9 条回复
boboliu
2020-06-07 23:07:14 +08:00
一般来讲,受限于 go 的强权限控制和弱鸡反射,正常的 go 用户不会选择直接序列化一个内部使用的结构体,你可以选择定义一个用于数据交换的结构体进行序列化和反序列化
noobCoderZzz
2020-06-07 23:52:21 +08:00
@boboliu 我主要是想打印出来看看这个实体的结构和内容 goland debug 下显示的结构看的我很难受。。。 另外问一下 goland 的调试是不可逆的吗?别的语言都支持拖拽调试的游标,goland 怎么才能回到前几步?
reus
2020-06-08 00:19:08 +08:00
@boboliu https://pkg.go.dev/golang.org/x/net/html?tab=doc#Node 看定义,字段全都是公有的,何来“内部使用的结构体”?

报错都告诉你原因了,有环,也就是有 *html.Node 类型的成员指向了自身。这种带环的结构,换成任何语言,都很难序列化。
joesonw
2020-06-08 09:56:12 +08:00
试试 litter
neoblackcap
2020-06-08 10:58:15 +08:00
@noobCoderZzz 退回前几步?应该都是可以的,不就是倒回去之前几个栈嘛,如果你觉得还不够,要不上 mozilla 的 rr debugger
liuhan907
2020-06-08 13:00:22 +08:00
@reus 其实,C#一直都有对带环对象的序列化支持。
boboliu
2020-06-08 14:40:25 +08:00
@reus #3 啊是我瞎了,昨晚有点困没看清
noobCoderZzz
2020-06-10 19:58:55 +08:00
@neoblackcap 没找到。。 比如 idea 和 rider,debug 的时候游标是可以随便拖的,goland 根本不能拖
noobCoderZzz
2020-06-10 20:07:51 +08:00
@joesonw 感谢 非常有用 就是我想找到功能!

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

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

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

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

© 2021 V2EX