2017-02-06 7 views
0

я сериализовать следующий OCaml тип записи с помощью SexpОшибка десериализации Sexp из строки

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)))\"")

Я попытался удалить кавычки экранированы, но она по-прежнему дает мне ту же ошибку. Может кто-нибудь объяснить ошибку?

ответ

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, sexp_of_char и т.д.

+0

Пробовал это, я все еще получаю та же ошибка. – Kapil

+0

попробуй больше :) Я тестировал его перед публикацией, и это работает, конечно. – ivg

+0

Я думаю, что проблема связана с {user_id = "941952"}. Я отредактировал вопрос, чтобы дать больше контекста. user_id - целое поле. Можете ли вы попробовать сделать это? – Kapil

 Смежные вопросы

  • Нет связанных вопросов^_^