2017-06-07 2 views
2

Ich habe eine Liste von Aeson Objekte wie diesesWie füge ich Aeson-Objekte zusammen?

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

und ich möchte sie als Objekt einzelne Aeson verschmelzen wie diese

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

Dieser ziemlich Standard ist, wenn sie mit JSON-Daten in anderen Sprachen arbeiten (Zusammenführungsoperation), aber ich sehe in der Aeson-Bibliothek nichts Ähnliches.

Fehle ich gerade etwas und kann dies mit einigen Standard-Haskell-Funktion getan werden? Ich versuchte mit sequence aber es scheint, dass JSON Value ist keine Monade, also kann ich das nicht tun.

Ich brauche nicht mit tiefen Verschmelzung oder Nachschlüssel zu tun, ich möchte nur etwas erzeugen, wie

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

von

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

Wenn Sie Objekte mit Typen haben der 'Object' dann ist es nur' HashMap', so dass Sie verwenden können, 'HashMap.union' , 'mappend',' (<>) 'usw. Aber wenn Sie Objekte mit Typen den' Wert' haben, wie wollen Sie sie zusammenführen? Zum Beispiel haben Sie eine Zeichenfolge und eine Zahl, welches Ergebnis muss sein? – freestyle

+0

Ich will nur das Verhalten der Gewerkschaften. Ich möchte eine Karte mit allen Schlüsseln und ihren Werten und wenn ein Schlüssel dupliziert ist, bin ich froh, dass der letzte die anderen überschreibt. Im Wesentlichen das gleiche Verhalten wie bei ruby ​​bei der Ausführung von 'hash1.merge (hash2)' – Batou99

Antwort

4

In Anbetracht der Liste enthält nur von JSON-Objekte (also Elemente, die Schlüssel-Wert-Paare oder Elemente mit der Object constructor haben), können Sie Ihre eigenen schreiben:

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) 

Wenn wir die obige Funktion mit der angegebenen Probeneingabe zu testen, erhalten wir:

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