2017-06-07 6 views
2

J'ai une liste d'objets AESON comme celui-ciComment fusionner des objets Aeson?

[object ["key1" .= "value1"], object ["key2" .= "value2"]] 

et je veux les fusionner en un seul objet Aeson comme celui-ci

object ["key1" .= "value1", "key2" .= "value2"] 

Ceci est tout à fait standard lorsque vous travaillez avec des données JSON dans d'autres langues (opération de fusion) mais je ne vois rien de similaire dans la bibliothèque Aeson.

Suis-je manque juste quelque chose et cela peut-il être fait avec une fonction standard haskell? J'ai essayé d'utiliser sequence mais il semble que JSON Value n'est pas une monade donc je ne peux pas le faire.

Je ne ai pas besoin pour faire face à la fusion profonde ou dupliquer les clés, je veux juste générer quelque chose comme

{ 
    "key1": value1, 
    "key2": value2 
} 

de

[{ "key1": value1 }, { "key2": value2 }] 
+0

Si vous avez des objets avec des types la 'Object' alors il est juste' HashMap', vous pouvez utiliser 'HashMap.union' , 'mappend',' (<>) 'etc. Mais si vous avez des objets avec les types' Value', comment voulez-vous les fusionner? Par exemple, vous avez une chaîne et un nombre, quel résultat doit être? – freestyle

+0

Je veux juste le comportement 'unions '. Je veux une carte avec toutes les clés et leurs valeurs et si une clé est dupliquée je suis heureux de laisser le dernier écraser les autres. Essentiellement le même comportement que vous obtenez sur ruby ​​lorsque vous faites 'hash1.merge (hash2)' – Batou99

Répondre

4

Compte tenu de la liste contient seulement des objets JSON (donc les éléments qui ont des paires clé-valeur ou des éléments avec le Object constructor), vous pouvez écrire le vôtre:

import Data.Aeson(Value(Object)) 
import qualified Data.HashMap.Lazy as HML 

merge_aeson :: [Value] -> Value 
merge_aeson = Object . HML.unions . map (\(Object x) -> x) 

Si nous testons la fonction ci-dessus avec l'entrée d'échantillon donné, on obtient:

Prelude Data.Aeson HML> merge_aeson [object ["key1" .= "value1"], object ["key2" .= "value2"]] 
Object (fromList [("key2",String "value2"),("key1",String "value1")])