【问题标题】:Parsing JSON as Array(String) in Kemal在 Kemal 中将 JSON 解析为数组(字符串)
【发布时间】:2020-03-26 13:20:54
【问题描述】:

我想创建一个接收 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】:

    我在文档中找到了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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-23
      • 2018-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多