我有一个
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
这给了我一个数组,但似乎我需要对元素进行类型转换以实际使用它们,否则我得到Nil的未定义方法'[]'(编译时类型是(Nil | String | Int64 | Float64 | Bool | Hash(String,JSON :: Type)| Array(JSON :: Type))).
我尝试使用Array(Hash),但这使得我不能使用Hash(K,V)作为泛型类型参数,使用更具体的类型.
如何指定类型?
解决方法@H_404_16@
您必须在访问元素时强制转换这些元素:
projects = JSON.parse(json).as(Array)
project = projects.first.as(Hash)["project"].as(Hash)
id = project["id"].as(Int64)
但是对于像这样的结构良好的数据,你最好使用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
您可以在https://github.com/manastech/crystal/issues/982#issuecomment-121156428查看有关此问题的更详细说明
projects = JSON.parse(json).as(Array) project = projects.first.as(Hash)["project"].as(Hash) id = project["id"].as(Int64)
但是对于像这样的结构良好的数据,你最好使用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
您可以在https://github.com/manastech/crystal/issues/982#issuecomment-121156428查看有关此问题的更详细说明