【问题标题】:Error deserializing sexp from string从字符串反序列化 sexp 时出错
【发布时间】:2017-02-06 15:27:35
【问题描述】:

我使用 sexp 序列化了以下 ocaml 记录类型

module User =
struct
  type id = int (*Uuid.t*) [@@deriving sexp]
module UserName =
struct
  type id = string [@@deriving sexp]
  type userId = {user_id: User.id} [@@deriving sexp]
  type eff = Add of userId | GetId [@@deriving sexp]
  let effToString x = Sexp.to_string (sexp_of_eff x)
  let stringToEff x = (*let y = string_before x 24 in 
                        eff_of_sexp (sexp_of_string (string_after y 1))*)
                      eff_of_sexp (Sexp.of_string x)
  let id_to_str x = x
end

上述记录的示例 sexp 类似于 (Add((user_id 756438)))

我将 sexp 转换为字符串,以便使用

将其嵌入到 json 中

let effToString x = (*Sexp.to_string_hum*) Sexp.to_string (sexp_of_eff x)

我正在尝试使用以下代码将 sexp 字符串反序列化回记录类型

let stringToEff x = eff_of_sexp (sexp_of_string x)

我收到了错误

Fatal error: exception (Sexplib.Conv.Of_sexp_error (Failure "Microblog_app_runtime.UserName.eff_of_sexp: unexpected sum tag") "\"(Add((user_id 941952)))\"")

我尝试删除转义引号,但它仍然给我同样的错误。有人可以解释错误吗?

【问题讨论】:

    标签: ocaml


    【解决方案1】:

    您应该使用Sexp.of_string 而不是sexp_of_string 进行字符串解析:

    let stringToEff x = eff_of_sexp (Sexp.of_string x)
    

    例如,

    # effToString (Add {user_id = "941952"}) |> stringToEff;;
    - : eff = Add {user_id = 941952}
    

    两者之间存在细微差别。 Sexp.of_string 会将任意字符串解析为 sexp 数据结构,而 sexp_of_string 是字符串(即 Atom)的 sexp 表示,参见 sexp_of_int、sexp_of_char 等。

    【讨论】:

    • 加倍努力 :) 我在发帖前确实测试过它,它当然有效。
    • 我认为问题出在 {user_id = "941952"}。我编辑了这个问题以提供更多背景信息。 user_id 是一个整数字段。您可以尝试进行此更改吗?
    • 你的代码工作得很好,我可以总结一下,例如,UserName.effToString UserName.(Add {user_id = 941952}) |> UserName.stringToEff 并且没有例外。字符串表示形式如下所示:"(Add((user_id 941952)))"。确保您已经更新了代码,没有忘记编译、安装它,并且实际上您正在寻找您正在寻找的地方。
    • 如果您不相信我,那么您可以将自己的代码复制粘贴到顶层并自己查看:)
    猜你喜欢
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 2013-01-16
    • 1970-01-01
    • 2020-11-23
    • 1970-01-01
    相关资源
    最近更新 更多