2017-10-18 5 views
0

J'essaye de charger json en utilisant la bibliothèque Aeson. Le fait est que la structure de données dans laquelle je veux le charger contient plus de champs que le json. Où seuls les champs nom et fichier sont disponibles dans le fichier json. L'image est une image brillante qui ne peut pas vraiment être chargée à partir de JSON.Donne une valeur par défaut pour les champs non disponibles dans json en utilisant aeson

Je n'arrive pas à comprendre comment ignorer res et charger hors de l'instance FromJSON.

+0

Où est cette information supposée provenir, sinon de l'entrée JSON? – leftaroundabout

+0

L'image est chargée plus tard, après avoir lu le json, et à ce moment le champ chargé sera également défini. Je suppose qu'un chargement peut être faux par défaut, mais la question reste de savoir comment le faire. – blackwolf123333

+1

Mais alors, quelle devrait être la valeur de 'res' quand l'image n'est pas chargée? Comme ce n'est pas java, il ne peut pas être "nul", il doit s'agir d'une image. Si vous voulez qu'il soit capable d'être nul, vous devez changer le type en 'Maybe Picture'. – jpath

Répondre

4

Si vous ne pouvez pas charger cette structure à partir de JSON, ne la définissez pas de cette façon! Make it

data ResourceRef = ResRef 
       { name :: String 
       , file :: FilePath 
       } deriving (Generic, Show) 

Cela peut être facilement chargé à partir de JSON. Vous pouvez alors avoir un

data Resource = Res 
       { resName :: String 
       , resFile :: FilePath 
       , res :: Picture 
       } deriving (Generic, Show) 

qui n'entrera jamais en contact avec JSON. Et implémenter

loadResource :: ResourceRef -> IO Resource 
+0

Juste 33 secondes avant d'écrire fondamentalement la même réponse :) –

+0

Merci, j'ai fini par faire quelque chose comme ça en effet – blackwolf123333

+0

Je pose une question de suivi cependant? Parce qu'actuellement comment je lis le contenu du fichier est un désordre parce que le readFile ordinaire ne sort pas un ByteString. Comment pourrais-je résoudre ce problème? – blackwolf123333