2016-06-20 7 views
1

readFileから2つの値をとるデータ構造がある場合は、 toJSONインスタンス宣言のフィールド名としてこれらの値を使用するにはどうすればよいですか?Haskell:aesonを使用した動的オブジェクトフィールド名

たとえば、以下のコードでは、入力ファイルによって「2015」および「2016」という名前が変更されます。

data MyOutput = MyOutput 
       { periodOne :: YearInfo 
       , periodTwo :: YearInfo 
       , updateStamp :: String 
       } deriving (Show) 

instance ToJSON MyOutput where 
    toJSON MyOutput {..} = 
    object [ "2015"  .= periodOne 
      , "2016"  .= periodTwo 
      , "Data up to" .= updateStamp 
      ] 

答えて

3

残念ながらToJSONインスタンスは、データ構造の外部の値に依存することはできません。

私の提案はperiodOneperiodTwoのフィールド名が含まれるように、データ構造を変更することです:

data MyOutput = MyOutput { 
        periodOneName, periodTwoName :: String, 
        periodOne, periodTwo :: YearInfo 
        ... 
       } 

toJSONインスタンスは、期間の名前へのアクセスを持っています。

コンプリート例:

{-# LANGUAGE RecordWildCards #-} 
{-# LANGUAGE OverloadedStrings #-} 

import Data.Aeson 
import qualified Data.Text as T 

type YearInfo = [ Int ] 

data MyOutput = MyOutput 
       { periodOne :: YearInfo 
       , periodTwo :: YearInfo 
       , periodOneName :: T.Text 
       , periodTwoName :: T.Text 
       , updateStamp :: String 
       } deriving (Show) 

instance ToJSON MyOutput where 
    toJSON MyOutput {..} = 
    object [ periodOneName .= toJSON periodOne 
      , periodTwoName .= toJSON periodTwo 
      , "Data up to" .= toJSON updateStamp 
      ] 
+0

あなたはToJsonインスタンスを書き出すほど親切だろう。 – matthias

+0

答えが更新されました。 – ErikR

+0

非常に高く評価されました – matthias

関連する問題