Создать модель Granite из параметров JSON
То, что я хотел бы, чтобы произошло: кто-то может сделать запрос на почту users/new
с параметрами, и я хотел бы создать User
объект из параметров JSON.
В файле readme он дает такой пример:
foo = Foo.from_json(%({"name": "Granite1"}))
Но когда я пытаюсь сделать это, я получаю эту ошибку во время компиляции:
in /usr/local/Cellar/crystal/0.26.1/src/json/pull_parser.cr:13: no
overload matches 'JSON::Lexer.new' with type Hash(String, Array(JSON::Any) | Bool | Float64 | Hash(String, JSON::Any) | Int64 | String | Nil)
Overloads are:
- JSON::Lexer.new(string : String)
- JSON::Lexer.new(io : IO)
- JSON::Lexer.new()
@lexer = Lexer.new input
^~~
Вот что env.params.json
выглядит при входе в консоль:
{"name" => "test",
"username" => "tester",
"email" => "test",
"password" => "test"}
Любая помощь приветствуется.
1 ответ
Компилятор направляет вас в правильном направлении. Похоже, вы передаете переменную, которая во время компиляции имеет тип Hash(String, V)
где V
это один из типов
Array(JSON::Any)
Bool
Float64
Hash(String, JSON::Any)
Int64
String
Nil
То, что он ожидает, это String
(или IO
объект, который похож на String
) из JSON. Это то, что у вас есть в примере. %(foo)
это еще один способ создать String
"foo"
(Для получения дополнительной информации см. "Процентные строковые литералы" в руководстве). Они используют его здесь, потому что это позволяет вам избежать экранирования двойных кавычек, используемых в JSON.
Основываясь на типе времени компиляции, который Crystal дал вашему параметру, я предполагаю, что он уже был преобразован из JSON в Crystal Hash
, Дважды проверьте, что вы не анализируете его дважды.
Не видя источника, я не могу предоставить больше информации, но я надеюсь, что это поможет.