2017-06-07 6 views
2

私はこのAesonオブジェクトをマージするには?

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

ようアイソーンオブジェクトのリストを持っていると私は他の言語でJSONデータを扱うときにこれはかなり標準であり、この

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

のような単一アイソーンオブジェクトとしてそれらをマージしたいです(マージ操作)、私はAesonライブラリには何も似ていません。

私は何かを見逃していますが、これは標準的なhaskell関数で行うことができますか?私はsequenceを使ってみましたが、JSON Valueはモナドではありませんので、私はそれを行うことはできません。

私はちょうどリストはのみ JSONオブジェクトのを含んで考える

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

をあなたがタイプでオブジェクトを持っている場合は、 'Object'が、それは単に' HashMap'ですので、あなたは 'HashMap.union'を使用することができます、 'mappend'、'(<>) 'などです。しかし、もしあなたが' Value'型のオブジェクトを持っているなら、それらをどのようにマージしたいですか?たとえば、文字列と数字がありますが、その結果はどうですか? – freestyle

+0

私は 'unions'の動作がほしいだけです。すべてのキーとその値を持つMapが必要です。キーが重複している場合は、最後のキーを上書きすることができます。基本的に 'hash1.merge(hash2)'を実行したときにルビーと同じ動作をします。 – Batou99

答えて

4

から

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

のようなものを生成したい、深いマージを扱うかのキーを複製する必要はありません。 (したがって、キーと値のペアまたは要素がObject constructorである要素)は、独自に記述することができます。

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) 

私たちは与えられたサンプル入力で上記の機能をテストする場合、我々は得る:

Prelude Data.Aeson HML> merge_aeson [object ["key1" .= "value1"], object ["key2" .= "value2"]] 
Object (fromList [("key2",String "value2"),("key1",String "value1")]) 
関連する問題