我使用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)))\"")
我尝试删除转义的引号,但它仍然给我同样的错误。有人可以解释一下这个错误吗?
答案 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等等。