【问题标题】:Create Granite model from JSON params从 JSON 参数创建 Granite 模型
【发布时间】:2018-09-11 12:40:41
【问题描述】:

我希望发生的事情:有人可以使用参数向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】:

    编译器在这里引导您朝着正确的方向前进。看起来您正在传递一个变量,该变量在编译时具有 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。仔细检查你没有解析两次。

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

    【讨论】:

    • 感谢您的帮助!我已经有一段时间没有时间从事那个项目了。一旦我这样做了,如果你的解决方案有效,我会接受它作为答案。
    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 2015-09-20
    • 1970-01-01
    相关资源
    最近更新 更多