我想发生的事情:有人可以向带有参数的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"}
任何帮助将不胜感激。
答案 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
。仔细检查您是否没有解析两次。
我没有提供更多信息,但是我希望能对您有所帮助。