Создать модель Granite из параметров JSON - PullRequest
0 голосов
/ 11 сентября 2018

То, что я хотел бы, чтобы произошло: кто-то может отправить запрос на 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 Ответ

0 голосов
/ 16 сентября 2018

Компилятор направляет вас в правильном направлении.Похоже, вы передаете переменную, которая во время компиляции имеет тип 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 в кристалл Hash.Дважды проверьте, что вы не анализируете его дважды.

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

...