从JSON参数创建Granite模型

时间:2018-09-11 12:40:42

标签: crystal-lang kemal

我想发生的事情:有人可以向带有参数的users/new发送请求,而我想根据JSON参数创建一个User对象。

在自述文件中,给出了以下示例:

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 :(得分:1)

编译器在这里指导您正确的方向。看来您要传入一个在编译时为Hash(String, V)类型的变量,其中V是其中一种类型

  • Array(JSON::Any)
  • Bool
  • Float64
  • Hash(String, JSON::Any)
  • Int64
  • String
  • Nil

期望 是JSON的String(或IO对象,类似于String)。这就是示例中的内容。 %(foo)是创建String "foo"的另一种方法(有关更多信息,请参见指南中的"Percent string literals")。他们在这里使用它是因为它可以避免转义JSON中使用的双引号。

基于Crystal为您提供的参数的编译时类型,我猜想它已经从JSON转换为Crystal Hash。仔细检查您是否没有解析两次。

我没有提供更多信息,但是我希望能对您有所帮助。