从字符串反序列化sexp时出错

时间:2017-02-06 15:27:36

标签: ocaml

我使用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

上述记录的示例性别看起来像(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)))\"")

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

1 个答案:

答案 0 :(得分: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是字符串的sexp表示(即Atom),参见sexp_of_int,{{1等等。