将Kemal中的JSON解析为Array(String)

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

我想创建一个接收JSON数据的端点,并将其解析为字符串数组。

POST /
{
  "keys": ["foo", "bar"]
}

我遇到类型系统问题。这是我尝试过的(.as(Array(String))),但无法编译:

require "kemal"

def print_keys(keys : Array(String))
  puts "Got keys: #{keys}"
end

post "/" do |env|
  keys = env.params.json["keys"].as(Array(String)) # <-- ERROR
  print_keys(keys)
end

Kemal.run

错误消息是:

 8 | keys = env.params.json["keys"].as(Array(String)) # <-- ERROR
        ^
Error: can't cast (Array(JSON::Any) | Bool | Float64 | Hash(String, JSON::Any) | Int64 | String | Nil) to Array(String)

如果更改代码以解析不是Array(String),而是解析为String,则编译不会出现问题。为什么在类型为.as而不是Array(String)String方法中有所区别?

如何更改代码以解析字符串数组?

json crystal-lang type-systems kemal
1个回答
0
投票

我在使用an example的文档中找到JSON.mapping。在我的具体示例中,可以这样写:

require "kemal"

def print_keys(keys : Array(String))
  puts "Got keys: #{keys}"
end

class KeyMappings
  JSON.mapping({
    keys: Array(String)
  })
end

post "/" do |env|
  json = KeyMappings.from_json env.request.body.not_nil!
  print_keys(json.keys)
end

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