2016-06-20 1 views
1

Si j'ai une structure de données qui prend en deux valeurs de readFile; comment puis-je utiliser ces valeurs que les noms des champs pour mon toJSON déclaration d'instance?Haskell: objet dynamique nom de champ avec Aeson

Par exemple, dans le code ci-dessous, les noms « 2015 » et « 2016 » doivent changer en fonction du fichier d'entrée.

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 
      ] 

Répondre

3

Malheureusement ToJSON cas ne peut pas dépendre des valeurs externes à la structure de données.

Ma suggestion est de changer la structure de données pour inclure les noms de champs pour periodOne et periodTwo:

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

Maintenant, l'instance toJSON a accès aux noms des périodes.

Exemple complet:

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

auriez-vous l'amabilité d'écrire l'instance toJSON. – matthias

+0

réponse mis à jour. – ErikR

+0

beaucoup apprécié – matthias