J'ai un objet json. Il a plusieurs champs "passthrough_fields" qui ne sont pas nécessaires pour moi et je veux les supprimer. Existe-t-il un moyen de filtrer tous ces attributs? JSON:
{ "type": "playable_item", "id": "p06s0lq7", "urn": "urn:bbc:radio:episode:p06s0mk3", "network": { "id": "bbc_radio_five_live", "key": "5live", "short_title": "Radio 5 live", "logo_url": "https://sounds.files.bbci.co.uk/v2/networks/bbc_radio_five_live/{type}_{size}.{format}", "passthrough_fields": {} }, "titles": { "primary": "Replay", "secondary": "Bill Shankly", "tertiary": null, "passthrough_fields": {} }, "synopses": { "short": "Bill Shankly with Sue MacGregor in 1979 - five years after he resigned as Liverpool boss.", "medium": null, "long": "Bill Shankly in conversation with Sue MacGregor in 1979, five years after he resigned as Liverpool manager.", "passthrough_fields": {} }, "image_url": "https://ichef.bbci.co.uk/images/ic/{recipe}/p06qbz1x.jpg", "duration": { "value": 1774, "label": "29 mins", "passthrough_fields": {} }, "progress": null, "container": { "type": "series", "id": "p06qbzmj", "urn": "urn:bbc:radio:series:p06qbzmj", "title": "Replay", "synopses": { "short": "Colin Murray unearths classic sports commentaries and interviews from the BBC archives.", "medium": "Colin Murray looks back at 90 years of sport on the BBC by unearthing classic commentaries and interviews from the BBC archives.", "long": null, "passthrough_fields": {} }, "activities": [], "passthrough_fields": {} }, "availability": { "from": "2018-11-16T16:18:54Z", "to": null, "label": "Available for over a year", "passthrough_fields": {} }, "guidance": { "competition_warning": false, "warnings": null, "passthrough_fields": {} }, "activities": [], "uris": [ { "type": "latest", "label": "Latest", "uri": "/v2/programmes/playable?container=p06qbzmj&sort=sequential&type=episode", "passthrough_fields": {} } ], "passthrough_fields": {} }
Existe-t-il un moyen de supprimer tous ces champs et de stocker le json mis à jour dans une nouvelle variable?
3 Réponses :
Je pense que la solution la plus simple serait de:
convertir JSON en hachage ( JSON.parse (input)
)
utilisez cette réponse pour étendre la fonctionnalité de Hash (enregistrez-la dans config / initializers / except_nested.rb
)
sur le hachage de la 1ère étape, appelez:
without_passthrough = your_hash.except_nested ('passthrough_fields')
hachage caché en JSON ( without_passthrough.to_json
)
Veuillez garder à l'esprit que cela fonctionnera pour les passthrough_fields
qui sont directement imbriqués dans les hachages. Dans votre JSON, vous avez la partie suivante:
"uris" => [ { "type"=>"latest", "label"=>"Latest", "uri"=>"/v2/programmes/playable?container=p06qbzmj&sort=sequential&type=episode", "passthrough_fields"=>{} } ]
Dans ce cas, les passthrough_fields
ne seront pas supprimés. Vous devez trouver une solution plus sophistiquée :)
Vous pouvez le faire de manière récursive pour traiter les occurrences imbriquées de passthrough_fields
, qu'elles se trouvent dans un tableau ou un sous-hachage. Commentaires en ligne pour expliquer un peu les choses au fur et à mesure:
hash = { "test" => { "passthrough_fields" => [1, 2, 3], "wow" => '123' }, "passthrough_fields" => [4, 5, 6], "array_values" => [{ "to_stay" => "I am", "passthrough_fields" => [7, 8, 9]}] } remove_recursively(hash, 'passthrough_fields') #=> {"test"=>{"wow"=>"123"}, "array_values"=>[{"to_stay"=>"I am"}]} remove_recursively(hash, 'passthrough_fields', 'wow', 'to_stay') #=> {"test"=>{}, "array_values"=>[{}]}
Pour démontrer, avec un exemple simplifié:
hash = JSON.parse(input) #Â convert the JSON to a hash def remove_recursively(hash, *to_remove) hash.each do |key, val| hash.except!(*to_remove) # the heavy lifting: remove all keys that match `to_remove` remove_recursively(val, *to_remove) if val.is_a? Hash #Â if a nested hash, run this method on it if val.is_a? Array # if a nested array, loop through this checking for hashes to run this method on val.each { |el| remove_recursively(el, *to_remove) if el.is_a? Hash } end end end remove_recursively(hash, 'passthrough_fields')
Cela abordera tous les tableaux , et cherchera des hachages imbriqués quelle que soit la profondeur nécessaire.
Il faut n'importe quel nombre de champs pour supprimer, dans ce cas un seul 'passthrough_fields'
.
J'espère que cela vous aidera, dites-moi comment vous vous en sortez.
Cela a-t-il aidé du tout @NipunTanay? Croyez que cela fait tout ce que vous recherchez - dites-moi comment vous vous en sortez.
Cela a fonctionné comme un charme @SRack. Merci beaucoup pour cela.
Vous pouvez faire quelque chose comme ceci:
json = { :a => 1, :b => 2, :c => { :a => 1, :b => { :a => 1 } } } nested_except(json, :a) # => {:b=>2, :c=>{:b=>{}}}
Voir exemple:
def nested_except(hash, except_key) sanitized_hash = {} hash.each do |key, value| next if key == except_key sanitized_hash[key] = value.is_a?(Hash) ? nested_except(value, except_key) : value end sanitized_hash end json = JSON.parse(json_string) sanitized = nested_except(json, 'passthrough_fields')
Cet assistant peut facilement être converti pour prendre en charge plusieurs clés en sauf, simplement par except_keys = Array.wrap (except_key)
et next if except_keys.include? (key)