2017-10-18 2 views
0
verfügbar sind

Ich versuche, Json mit der Aeson-Bibliothek zu laden. Die Sache ist, dass die Datenstruktur, in die ich es laden will, mehr Felder enthält als der JSON.Geben Sie einen Standardwert für Felder, die nicht in Json mit AESON

data Resource = Res { 
        name :: String, 
        file :: FilePath, 
        res :: Picture, 
        loaded :: Bool 
       } deriving (Generic, Show) 

Wo nur der Name und die Dateifelder sind in der JSON verfügbar. Bild ist ein Glanzbild, so dass es nicht wirklich von JSON geladen werden kann.

Ich kann nicht herausfinden, wie res auslassen und geladen von der FromJSON-Instanz.

+0

Woher soll diese Information stammen, wenn nicht vom JSON-Eingang? – leftaroundabout

+0

Das Bild wird später geladen, nachdem der JSON eingelesen wurde, und zu diesem Zeitpunkt wird das geladene Feld ebenfalls gesetzt. Ich denke, dass ein geladener Fehler standardmäßig falsch sein kann, aber die Frage bleibt, wie das geht. – blackwolf123333

+1

Aber was sollte dann der Wert von "res" sein, wenn das Bild nicht geladen ist? Da dies nicht Java ist, kann es nicht "null" sein, es muss ein Bild sein. Wenn Sie möchten, dass es "null" sein kann, müssen Sie den Typ in "Maybe Picture" ändern. – jpath

Antwort

4

Wenn Sie diese Struktur nicht aus JSON laden können, definieren Sie sie nicht auf diese Weise! Machen Sie es

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

Das kann leicht von JSON geladen werden. Sie können dann eine zusätzliche

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

... haben, die nie in Kontakt mit JSON kommt. Und implementieren

loadResource :: ResourceRef -> IO Resource 
+0

Nur 33 Sekunden, bevor ich im Grunde die gleiche Antwort schrieb :) –

+0

Vielen Dank, ich tat so etwas wirklich in der Tat – blackwolf123333

+0

Konnte Ich frage jedoch eine Follow-up-Frage? Weil momentan, wie ich den Dateiinhalt lese, ein Durcheinander ist, weil das reguläre readFile keinen ByteString ausgibt. Wie könnte ich das beheben? – blackwolf123333

Verwandte Themen