1

私は非常に「柔軟」な JSON を扱っているため、オブジェクトが配列である場合もあれば、文字列である場合もあれば、まったく存在しない場合もあります。また、かなり深く入れ子になっています。

たとえば、API 呼び出しは結果のリストを返し、各結果にはゼロ、1 つ、または多数のサムネイルが含まれる場合があります。サムネイルが1つしかない場合はサムネイルを返し、多数ある場合は最初のサムネイルを返し、ない場合はサムネイルを返し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

ハッシュアクセスをチェーンするとき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 に答える
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 に答える