crystal-lang - 如何指定JSON解析的数据类型?

标签 crystal-lang

我有一个 JSON 响应,它是一个哈希数组:

[{"project" => {"id" => 1, "name" => "Internal"},
 {"project" => {"id" => 2, "name" => "External"}}]

我的代码如下所示:
client = HTTP::Client.new(url, ssl: true)
response = client.get("/projects", ssl: true)
projects = JSON.parse(response.body) as Array

这给了我一个数组,但似乎我需要对元素进行类型转换才能实际使用它们,否则我会得到 undefined method '[]' for Nil (compile-time type is (Nil | String | Int64 | Float64 | Bool | Hash(String, JSON::Type) | Array(JSON::Type))) .

我试过 as Array(Hash)但这给了我 can't use Hash(K, V) as generic type argument yet, use a more specific type .

如何指定类型?

最佳答案

您必须在访问元素时强制转换这些:

projects = JSON.parse(json).as(Array)
project = projects.first.as(Hash)["project"].as(Hash)
id = project["id"].as(Int64)

http://carc.in/#/r/f3f

但是对于像这样结构良好的数据,最好使用 JSON.mapping :
class ProjectContainer
  JSON.mapping({
    project: Project
  })
end

class Project
  JSON.mapping({
    id: Int64,
    name: String
  })
end

projects = Array(ProjectContainer).from_json(json)
project = projects.first.project
pp id = project.id

http://carc.in/#/r/f3g

您可以在 https://github.com/manastech/crystal/issues/982#issuecomment-121156428 看到对该问题的更详细的解释。

关于crystal-lang - 如何指定JSON解析的数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32552291/

相关文章:

crystal-lang - Crystal中的 "\x85"和 "\u{85}"有什么区别?

macros - 如何扩展Crystal语言语法?

dart - 为什么Dart无法从Crystal解码base64?

concurrency - 在没有 IO 的光纤之间循环

crystal-lang - 如何解析POST请求中的数据

crystal-lang - Crystal 中的速记 block 语法

instance-variables - 直接读取实例变量

sockets - 我将如何在 crystal 中设置一个可以与多个客户端通信的简单 unix 套接字服务器?

crystal-lang - 如何查看在编译时宏期间是否定义了常量/TypeNode?

crystal-lang - Crystal 通过引用或值传递变量