在 Ruby 中的大型 json 文件中搜索值
Search values in a large json file in Ruby
所以我正在学习 ruby,我必须在大 JSON 中找到特定的值。
我需要得到这个字段,但我做不到。
我有这个json:
[{"origen"=>
{"productor"=>"Agencia Estatal de Meteorología - AEMET. Gobierno de España",
"web"=>"https://www.aemet.es", "enlace"=>"https://www.aemet.es/es/eltiempo/prediccion/municipios/horas/lagran-id01030",
"language"=>"es",
"copyright"=>"© AEMET. Autorizado el uso de la información y su reproducción citando a AEMET como autora de la misma.",
"notaLegal"=>"https://www.aemet.es/es/nota_legal"},
"elaborado"=>"2022-03-30T22:43:40",
"nombre"=>"Lagrán",
"provincia"=>"Araba/Álava",
"prediccion"=>
{"dia"=>
[{"estadoCielo"=>
[{"value"=>"16", "periodo"=>"20", "descripcion"=>"Cubierto"},
{"value"=>"16n", "periodo"=>"21", "descripcion"=>"Cubierto"},
{"value"=>"82n", "periodo"=>"22", "descripcion"=>"Bruma"},
{"value"=>"16n", "periodo"=>"23", "descripcion"=>"Cubierto"}],
"precipitacion"=>[{"value"=>"0", "periodo"=>"20"}, {"value"=>"0", "periodo"=>"21"}, {"value"=>"0", "periodo"=>"22"}, {"value"=>"Ip", "periodo"=>"23"}],
"probPrecipitacion"=>[{"value"=>"5", "periodo"=>"2002"}],
"probTormenta"=>[{"value"=>"5", "periodo"=>"2002"}],
"nieve"=>[{"value"=>"0", "periodo"=>"20"}, {"value"=>"0", "periodo"=>"21"}, {"value"=>"0", "periodo"=>"22"}, {"value"=>"0", "periodo"=>"23"}],
"probNieve"=>[{"value"=>"0", "periodo"=>"2002"}],
"temperatura"=>[{"value"=>"7", "periodo"=>"21"}, {"value"=>"6", "periodo"=>"22"}, {"value"=>"6", "periodo"=>"23"}],
"sensTermica"=>[{"value"=>"4", "periodo"=>"21"}, {"value"=>"2", "periodo"=>"22"}, {"value"=>"3", "periodo"=>"23"}],
"humedadRelativa"=>[{"value"=>"81", "periodo"=>"21"}, {"value"=>"84", "periodo"=>"22"}, {"value"=>"87", "periodo"=>"23"}]
"vientoAndRachaMax"=>
[{"direccion"=>["N"], "velocidad"=>["15"], "periodo"=>"21"},
{"value"=>"45", "periodo"=>"21"},
{"direccion"=>["NO"], "velocidad"=>["19"], "periodo"=>"22"},
{"value"=>"39", "periodo"=>"22"},
{"direccion"=>["N"], "velocidad"=>["15"], "periodo"=>"23"},
{"value"=>"44", "periodo"=>"23"}],
"fecha"=>"2022-03-30T00:00:00",
"orto"=>"07:56",
"ocaso"=>"20:34"},
我想要字段 "fecha"=>"2022-03-30T00:00:00",
我正在尝试这个:
def json json
puts json[0].select {|json| json["fecha"]}
end
输出是这样的:
{}
所以我知道我做得很糟糕,因为我得到的是空白输出。
知道那里发生了什么吗?
谢谢!
好的,所以为了通过 Hash 进行导航(因为您共享的不是 JSON 本身,而是 ruby 哈希。) ,您可以使用 dig
方法。
--> 这里的用法示例:https://apidock.com/ruby/Hash/dig(我也建议阅读 rails 文档。)
您分享的内容也不是有效的散列,但我尝试自己关闭缺少的括号并且成功了。
试试这个:
def json json
json.dig(0, 'prediccion', 'dia', 0, 'fecha')
end
这是假设您始终需要根数组的第一个元素和 dia
数组的第一个元素。
如果您想动态获取它们,则必须循环遍历它们并将 0 替换为循环索引。
所以我正在学习 ruby,我必须在大 JSON 中找到特定的值。 我需要得到这个字段,但我做不到。
我有这个json:
[{"origen"=>
{"productor"=>"Agencia Estatal de Meteorología - AEMET. Gobierno de España",
"web"=>"https://www.aemet.es", "enlace"=>"https://www.aemet.es/es/eltiempo/prediccion/municipios/horas/lagran-id01030",
"language"=>"es",
"copyright"=>"© AEMET. Autorizado el uso de la información y su reproducción citando a AEMET como autora de la misma.",
"notaLegal"=>"https://www.aemet.es/es/nota_legal"},
"elaborado"=>"2022-03-30T22:43:40",
"nombre"=>"Lagrán",
"provincia"=>"Araba/Álava",
"prediccion"=>
{"dia"=>
[{"estadoCielo"=>
[{"value"=>"16", "periodo"=>"20", "descripcion"=>"Cubierto"},
{"value"=>"16n", "periodo"=>"21", "descripcion"=>"Cubierto"},
{"value"=>"82n", "periodo"=>"22", "descripcion"=>"Bruma"},
{"value"=>"16n", "periodo"=>"23", "descripcion"=>"Cubierto"}],
"precipitacion"=>[{"value"=>"0", "periodo"=>"20"}, {"value"=>"0", "periodo"=>"21"}, {"value"=>"0", "periodo"=>"22"}, {"value"=>"Ip", "periodo"=>"23"}],
"probPrecipitacion"=>[{"value"=>"5", "periodo"=>"2002"}],
"probTormenta"=>[{"value"=>"5", "periodo"=>"2002"}],
"nieve"=>[{"value"=>"0", "periodo"=>"20"}, {"value"=>"0", "periodo"=>"21"}, {"value"=>"0", "periodo"=>"22"}, {"value"=>"0", "periodo"=>"23"}],
"probNieve"=>[{"value"=>"0", "periodo"=>"2002"}],
"temperatura"=>[{"value"=>"7", "periodo"=>"21"}, {"value"=>"6", "periodo"=>"22"}, {"value"=>"6", "periodo"=>"23"}],
"sensTermica"=>[{"value"=>"4", "periodo"=>"21"}, {"value"=>"2", "periodo"=>"22"}, {"value"=>"3", "periodo"=>"23"}],
"humedadRelativa"=>[{"value"=>"81", "periodo"=>"21"}, {"value"=>"84", "periodo"=>"22"}, {"value"=>"87", "periodo"=>"23"}]
"vientoAndRachaMax"=>
[{"direccion"=>["N"], "velocidad"=>["15"], "periodo"=>"21"},
{"value"=>"45", "periodo"=>"21"},
{"direccion"=>["NO"], "velocidad"=>["19"], "periodo"=>"22"},
{"value"=>"39", "periodo"=>"22"},
{"direccion"=>["N"], "velocidad"=>["15"], "periodo"=>"23"},
{"value"=>"44", "periodo"=>"23"}],
"fecha"=>"2022-03-30T00:00:00",
"orto"=>"07:56",
"ocaso"=>"20:34"},
我想要字段 "fecha"=>"2022-03-30T00:00:00",
我正在尝试这个:
def json json
puts json[0].select {|json| json["fecha"]}
end
输出是这样的: {} 所以我知道我做得很糟糕,因为我得到的是空白输出。
知道那里发生了什么吗?
谢谢!
好的,所以为了通过 Hash 进行导航(因为您共享的不是 JSON 本身,而是 ruby 哈希。) ,您可以使用 dig
方法。
--> 这里的用法示例:https://apidock.com/ruby/Hash/dig(我也建议阅读 rails 文档。)
您分享的内容也不是有效的散列,但我尝试自己关闭缺少的括号并且成功了。 试试这个:
def json json
json.dig(0, 'prediccion', 'dia', 0, 'fecha')
end
这是假设您始终需要根数组的第一个元素和 dia
数组的第一个元素。
如果您想动态获取它们,则必须循环遍历它们并将 0 替换为循环索引。