2017-03-17 7 views
2

私はJSONのデータタイプUserのリストを符号化し、標準出力に出力し、次のHaskellコードを有する:、現時点でコードをハスケル/ Aseon:1つのオブジェクトとして出力JSON

{-# LANGUAGE OverloadedStrings #-} 

module Main where 

import Data.Aeson 
import Data.Text 
import qualified Data.ByteString.Lazy.Char8 as B 

data User = User 
    { id :: String 
    , name :: String 
    , address :: String 
    } deriving (Show) 

instance ToJSON User where 
    toJSON (User id name address) = object 
     [ pack id .= object 
      [ "name" .= name 
      , "address" .= address 
      ] 
     ] 

users :: [User] 
users = [ User "user 1" "name of user 1" "address of user 1" 
     , User "user 2" "name of user 2" "address of user 2" 
     ] 

main :: IO() 
main = B.putStrLn $ encode users 

[ 
    { 
    "user 1": { 
     "address": "address of user 1", 
     "name": "name of user 1" 
    } 
    }, 
    { 
    "user 2": { 
     "address": "address of user 2", 
     "name": "name of user 2" 
    } 
    } 
] 

しかし、私は出力以下JSON構造(内側の2つのオブジェクトを結合する)したい:

{ 
    "user 1": { 
    "name": "name of user 1", 
    "address": "address of user 1" 
    }, 
    "user 2": { 
    "name": "name of user 2", 
    "address": "address of user 2" 
    } 
} 
次の出力を生成します

希望するエンコード済みのJSONを印刷するには、どうすればtoJSONを変更する必要がありますか?

+0

haskellに流暢ではありませんが、内側のオブジェクトをラップする外側のオブジェクトを取り除くことはできますか? – MiltoxBeyond

+0

実際には、外側のオブジェクトを取り除くことはできません。内側のオブジェクトは2つで、1つではないからです。内側のものを最初にマージする必要があります。 – watain

+1

クエストオンにタイプミスはありますか?私は '' lastname ': "ユーザー2の名前"を希望の出力に見ますが、 '' lastname' 'は質問の他の場所には表示されません。 –

答えて

2

希望するエンコード済みのJSONを印刷するにはどうすればJSONに変更する必要がありますか?

UsertoJSONを変更して、希望するエンコードJSONを印刷することはできません。問題はUserエンコーディングではなく、リストエンコーディングで発生します。 JSON配列としてエンコードされたシンプルなリスト。 JSON配列には値がありません(したがって、["user 1":{...}]を持つことができず、各オブジェクトは{}にラップされます)。この問題はさまざまな方法で解決できます。一番簡単な解決策の1つは、Userのリストのカスタムエンコーダを書き込むことです。ここではそれがどのように見えるか:

main = B.putStrLn $ encode $ usersEncode users 

をそして、それはあなたに必要な出力が得られます。mainで、その後

import qualified Data.HashMap.Strict as HM 

usersEncode :: [User] -> Object 
usersEncode = HM.unions . map (\(Object user) -> user) . map toJSON 

ADNあなたはこのようにそれを呼び出すことができます。

aesonは、オブジェクトをとしてTextからValueに格納するというトリックです。 HashMapはJSONオブジェクトとしてエンコードされます。そこで、各ユーザーをシングルトンHashMapに変換してから、すべてHashMapを結合します。

注:userIdが重複しているユーザーをリストから削除します。

関連する問題