Ruby和JSON:使访问对象更加宽容

时间:2013-06-21 15:45:53

标签: ruby json

我正在处理一些非常“灵活”的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?

提前致谢。

2 个答案:

答案 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