js backend 当中对于 Option[T] 是如何存储的

问题的来源是我把这个数据 json stringify 存到 localStorage 当中了, 然后取出来

多次重复之后发现嵌套的数组非常深.

猜想是跟 json stringify 的实现有关, 有观察到 [v] undefined 被用在表示 Option[T] 相关的值. 不确定.

实际的问题估计还是在我自己的逻辑当中. 但想了解一下关于 Option[T] 的实现方式用于排查问题. 以及对此是否有推荐的最佳实践.

有没有能够产生这个输出的具体代码呢?当field的类型是Option[V]时, ToJson会将其处理为field: vundefined。看这里的类型@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。

1 个赞

感谢. 本来想着把 JSON 结构跟数据对对上然后缩小范围自己查的. 现在处理 Json? 的场景也还不熟练, 我理解一下.