问题的来源是我把这个数据 json stringify 存到 localStorage 当中了, 然后取出来
多次重复之后发现嵌套的数组非常深.
猜想是跟 json stringify 的实现有关, 有观察到 [v]
undefined
被用在表示 Option[T]
相关的值. 不确定.
实际的问题估计还是在我自己的逻辑当中. 但想了解一下关于 Option[T]
的实现方式用于排查问题. 以及对此是否有推荐的最佳实践.
问题的来源是我把这个数据 json stringify 存到 localStorage 当中了, 然后取出来
多次重复之后发现嵌套的数组非常深.
猜想是跟 json stringify 的实现有关, 有观察到 [v]
undefined
被用在表示 Option[T]
相关的值. 不确定.
实际的问题估计还是在我自己的逻辑当中. 但想了解一下关于 Option[T]
的实现方式用于排查问题. 以及对此是否有推荐的最佳实践.
有没有能够产生这个输出的具体代码呢?当field的类型是Option[V]时, ToJson会将其处理为field: v
或 undefined
。看这里的类型@json.JsonValue?
不像是会得到这种输出。
仔细看了一下,原来是手动实现的to_json和from_json不对称。
这一行Map::get返回的是Option[V],而不是V。所以from_json(to_json(x))了以后data字段的value会多套一层[]
,猜测这个输出是反复输出和读入json导致的。
比较尴尬的是Json类型实现了ToJson Trait,但是漏了FromJson,所以目前也不能直接对RespoStatesTree derive(ToJson,FromJson)
。手写的from_json可以改成:
pub impl @json.FromJson for RespoStatesTree with from_json(json, path) {
match json {
{ "data": data, "cursor": cursor, "branches": branches } => {
// data: @json.from_json!(data, path=path.add_key("data")), // Json FromJson not implemented yet
data: match data {
[v] => Some(v)
_ => None
},
cursor: @json.from_json!(cursor, path=path.add_key("cursor")),
branches: @json.from_json!(branches, path=path.add_key("branches")),
}
_ => raise @json.JsonDecodeError((path, "unexpected json"))
}
}
这里使用了Json pattern。
感谢. 本来想着把 JSON 结构跟数据对对上然后缩小范围自己查的. 现在处理 Json?
的场景也还不熟练, 我理解一下.