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)