2013-06-21 1 views
1

J'ai affaire à un JSON qui est assez "flexible", donc dans certains cas, un objet peut être un tableau, parfois une chaîne, et parfois il peut ne pas exister du tout. C'est aussi profondément imbriqué. Par exemple, l'appel d'API renvoie une liste de résultats et chaque résultat peut avoir zéro, une ou plusieurs vignettes. Je veux retourner la vignette s'il n'y en a qu'une, la première s'il y en a plusieurs, ou nil s'il n'y en a pas.Ruby et JSON: Rendre l'accès aux objets plus tolérant

Y at-il un moyen facile de le faire avec la bibliothèque JSON de Ruby?

En ce moment, je fais quelque chose comme ceci:

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 

Y at-il une manière plus tolérante pour accéder au JSON, autre que d'avoir à vérifier la présence et le type de chaque « niveau » Je m accéder?

Merci d'avance.

Répondre

0

J'ai fini par utiliser cette méthode que quelqu'un a suggéré, pour contourner les erreurs lors NoMethodFound enchaînant un accès de hachage:

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 
0

Vous pouvez le faire en forçant les choses comme vous voulez les utiliser. De cette façon, vous évitez de devoir constamment vérifier la présence de choses et pouvez simplement travailler avec ce qui existe ou des défauts raisonnables.

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 
Questions connexes