从JSON参数创建Granite模型

问题描述 投票:0回答:1

我希望发生什么:有人可以使用参数向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"}

任何帮助将非常感激。

crystal-lang kemal
1个回答
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。仔细检查一下你没有解析它两次。

没有看到来源,我可以提供的信息不多,但我希望有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.