我正在处理一些非常“灵活”的JSON,因此在某些情况下,对象可能是一个数组,有时它可能是一个字符串,有时可能根本不存在。它也是非常嵌套的。
例如,API调用返回结果列表,每个结果可能包含零个,一个或多个缩略图。如果只有一个,我想返回缩略图,如果有多个缩略图,则返回第一个缩略图;如果没有,则返回nil
。
使用Ruby的JSON库有一种简单的方法吗?
目前,我正在做这样的事情:
def get_thumbnail
if @json['results']
result = @json['results'].first
thumbnail = result['thumbnail']
if thumbnail
if thumbnail.class == String
thumbnail
elsif thumbnail.class == Array
thumbnail.first
else
nil
end
else
nil
end
end
end
除了必须检查我正在访问的每个“级别”的存在和类型之外,是否有更宽容的方式来访问JSON?
提前致谢。
答案 0 :(得分:0)
你可以按照你想对它们进行操作的方式来强制执行。通过这种方式,您可以避免不断检查事物的存在,并且可以使用那些或合理的默认值。
def thumbnail(json)
thumbnail_record(json).first
end
def thumbnail_record(json)
Array(first_record(json)['thumbnail'])
end
def first_record(json)
results(json).first || {}
end
def results(json)
Array(json['results'])
end
答案 1 :(得分:0)
我最终使用了某人建议的dig
方法,以便在链接哈希访问时解决NoMethodFound
错误:
class Hash
def dig(*path)
path.inject(self) do |location, key|
location.respond_to?(:keys) ? location[key] : nil
end
end
end
json = JSON.parse('{ "foo": [1, 2, 3, 4] }')
json.dig("foo") # Gives [1, 2, 3, 4]
json.dig("nonsense", "bar") # Gives nil