sein kann Ich arbeite mit einigen komplex formatierten JSON-Antworten von einem REST-Server. Um sie zu dekodieren, habe ich ein paar Datentypen, um die verschiedenen verschachtelten Objekte zu behandeln. Zum Beispiel:Aeson dekodieren JSON-Objekt, das eine Zeichenfolge oder ein Int
... Other types ...
data Profile =
Profile { fields :: [KVPair]
} deriving (Show)
instance FromJSON Profile where
parseJSON (Object v) =
Profile <$> v .: "Fields"
parseJSON _ = mzero
data KVPair =
KVPair { key :: Int
, value :: String
} deriving (Show)
instance FromJSON KVPair where
parseJSON (Object v) =
KVPair <$> v .: "Key"
<*> v .: "Value"
parseJSON _ = mzero
Alles funktioniert bis auf den letzten KVPair-Typ. Meine JSON-Objekte haben alle Integer-Schlüssel. jedoch können die Werte entweder eine ganze Zahl oder eine Zeichenkette:
{
"Key": 0,
"Value": "String Value!"
},
{
"Key": 1,
"Value": 42
}
Jetzt nehme ich an, ich könnte eine andere Summe Typ meinen Wert dekodieren hinzufügen, die von String
und Int
zusammengesetzt ist, aber ich würde eine ganz zu vermeiden, bevorzugen die Zugabe neuer Typ nur dafür. Hat Aeson eine einfache Möglichkeit, mit diesem Szenario umzugehen?
Wenn ich Ihre alternative Analyse Methode richtig verstehe, würde es nur die ganzzahligen Werte zu einem String-Typ, richtig? Also "Value": 3 würde zu etwas wie KVPair {value = "3"} oder? – jkeuhlen
@jkeuhlen Genau richtig, obwohl "coerce" in Haskell eine spezifische Bedeutung hat, die hier nicht gilt - "convert" oder "pretty-print" wäre näher zu korrigieren. –