在 Kemal 中将 JSON 解析为 Array(String)
Parsing JSON as Array(String) in Kemal
我想创建一个端点来接收 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
会有所不同?
如何更改代码以解析字符串数组?
我在文档中找到了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
我想创建一个端点来接收 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
会有所不同?
如何更改代码以解析字符串数组?
我在文档中找到了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