1

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

提前致谢。

4

2 回答 2

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
于 2013-06-21T16:54:20.780 回答
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
于 2013-06-24T09:40:27.027 回答