2016-06-20 10 views
1

Wenn ich eine Datenstruktur habe, die zwei Werte von readFile aufnimmt; Wie verwende ich diese Werte als Feldnamen für meine toJSON Instanz Deklaration?Haskell: Dynamischer Objektfeldname mit Aeson

Zum Beispiel im folgenden Code ändern sich die Namen "2015" und "2016" je nach Eingabedatei.

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 
      ] 

Antwort

3

Leider ToJSON Instanzen auf Werte außerhalb der Datenstruktur abhängen kann nicht.

Mein Vorschlag ist, die Datenstruktur zu ändern, um die Feldnamen für periodOne und periodTwo enthalten:

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

Nun ist die toJSON Instanz hat Zugriff auf die Namen der Perioden.

Komplettes Beispiel:

{-# 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

würden Sie so freundlich sein wie auf die toJSON Instanz auszuschreiben. – matthias

+0

Antwort aktualisiert. – ErikR

+0

sehr geschätzt – matthias