2017-10-27 3 views
0

Wir versuchen, ein JSON-Objekt mit der Aeson-JSON Hackage mit folgenden Daten zu entschlüsseln:- Gloss - JSON Beispiel Parser: Farbe

data Car = Car 
    { carPosition :: Position, 
    carColor  :: Color, 
    carDirection :: Direction } 
    deriving (Show, Generic) 

eine Instanz für Car Erstellt und taten das gleiche für die Daten Typen Postion, Direction:

instance FromJSON Position 
instance FromJSON Direction 
instance FromJSON Car 

Aber jetzt das Problem beginnt, Color der Datentyp stammt aus dem Gloss Hackage und der Wert ist zB geschrieben als Red. Die Color Daten wissen nur: deriving Show, also keine Möglichkeit, die deriving Generic hinzuzufügen. Wir haben versucht, den folgenden Code:

instance FromJSON Color where 
     parseJSON (Object v) = Color <$> 
     v .: "carColor" 

Sie rügt passend zu nicht-Typ Picture -> Picture und wir erwarten etwas wie Color.

Unsere Frage lautet: Wie können wir die Daten Color von Gloss verwenden, um ein JSON-Objekt wie

{ "carPostion": { "x": 0, "y": 10}, "carColor": "Red", "carDirection": "Up" }

Wir haben zu lesen versuchen, ein JSON-Objekt ohne carColor (nur für Testzwecke) zu lesen und dass funktioniert.

UPDATE: Es sieht wie diese Frage aus: Haskell Data.Decimal as Aeson type außer in unserem Fall wollen wir Color verwenden, wo in der gegebenen wie Data.Decimal ist der Störenfried.

+0

Wie sieht 'Color' aus? Außerdem macht es für mich keinen Sinn, das so zu analysieren. Ich würde 'parseJSON' auslassen, um eine JSON-Zeichenfolge oder etwas Ähnliches zu parsen. –

+0

@WillemVanOnsem Ich habe meine Frage aktualisiert. Das Hauptproblem ist 'Color', ohne diese Eigenschaft können wir ein JSON-Objekt mit dem gegebenen Code erfolgreich lesen. – Viletung

Antwort

0

Wenn alles, was Sie brauchen, ist Basis-Strings zu analysieren, das ist ziemlich einfach:

instance FromJSON Color where 
    parseJSON (String s) = maybe mzero return $ stringToColor s 
    parseJSON _ = mzero 


stringToColor :: String -> Maybe Color 
stringToColor s 
    | s == "red" = Just red 
    | s == "blue" = Just blue 
    ... -- fill in all of your options from Gloss 
    | otherwise = Nothing 

Dies ermöglicht Ihnen einen einfachen String in eine Ihrer Color Objekte zu drehen. Sobald Sie die FromJSON Instanz für Color haben, können Sie einfach instance FromJSON Car verwenden.

+0

Danke, ich denke, es gibt keine direkte Möglichkeit, dies zu tun (ohne Umwandlung von einer Zeichenfolge in eine Farbe). Wie auch immer, das löst das Problem :) – Viletung