Разбор JSON как массив (строка) в Kemal - PullRequest
1 голос
/ 26 марта 2020

Я хочу создать конечную точку, которая получает данные 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?

Как можно изменить код для анализа массивов строк?

1 Ответ

1 голос
/ 26 марта 2020

Я нашел пример в документации, где используется 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
...