Создать модель 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, Дважды проверьте, что вы не анализируете его дважды.

Не видя источника, я не могу предоставить больше информации, но я надеюсь, что это поможет.

Другие вопросы по тегам