0

我希望发生的事情:有人可以users/new使用参数发出发布请求,我想User从 JSON 参数创建一个对象。

在自述文件中,它给出了这个例子:

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"}

任何帮助将非常感激。

4

1 回答 1

1

编译器在这里引导您朝着正确的方向前进。看起来您正在传递一个变量,该变量在编译时具有Hash(String, V)其中V一种类型的类型

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

期望的是 JSON 的一个String(或一个IO对象,类似于 a String)。这就是您在示例中的内容。%(foo)是另一种创建方法String "foo"(有关更多信息,请参阅指南中的“百分比字符串文字”)。他们在这里使用它是因为它允许您避免转义 JSON 中使用的双引号。

根据 Crystal 为您提供的参数的编译时类型,我的猜测是它已经从 JSON 转换为 Crystal Hash。仔细检查您是否没有对其进行两次解析。

没有看到来源,我无法提供更多信息,但我希望这会有所帮助。

于 2018-09-16T04:19:16.817 回答