I die unglücklichen Daten zu arbeiten:Aeson mit Arrays von Arrays, von denen einige leer sind
{ "name": "foo"
, "data": [ []
, ["a", "b", "c", 1]
, ["d", "e", "f", 2] ] }
Die Dateneingaben erlaubt sind entweder leer Array oder ein Array der Größe vier sein.
Dass ich in analysieren wollen:
data ResultRow = ResultRow Text Text Text Int deriving (Show, Generic)
data ResultSet =
ResultSet { f_name :: Text
, f_data :: [Maybe ResultRow] } deriving (Show, Generic)
Die folgenden jedoch nicht die leeren Felder akzeptiert:
customOptions = defaultOptions { fieldLabelModifier = drop 2 }
instance FromJSON ResultRow where
parseJSON = genericParseJSON customOptions
instance FromJSON ResultSet where
parseJSON = genericParseJSON customOptions
Die Fehlermeldung lautet:
Left "Error in $[1].data[0]: When expecting a product of 4 values, encountered an Array of 0 elements instead"
Ich habe auch versucht, einen zusätzlichen Typ um [Maybe ResultRow]
und haben, dass die Sub-Arrays zu Listen und Pat konvertieren tern Match auf []
, und senden Sie die nicht leere Fall an die ResultRow
Parser, aber ich konnte einfach nicht zu kompilieren und ging verloren in den Fehlermeldungen.
Idealerweise hätte ich gerne eine Möglichkeit, die leeren Arrays zu überspringen, da sie nur Rauschen in den Daten sind. Ich habe keine Kontrolle über den Hersteller der Daten.
in diesem Fall würde ich nicht den generischen JSON-Parser verwenden, stattdessen würde ich es selbst mit den Kombinatoren von AESON schreiben! – epsilonhalbe
Willst du damit sagen, dass dies mit dem generischen JSON-Parser unmöglich/nicht durchführbar ist oder du einfach nicht weißt, wie man es macht und daher die Kombinatoren in einem Kommentar und nicht in einer Antwort empfehlen? Haben Sie Lesematerial, das nahe legt, dass Sie ähnliche In-Daten wie ich mit den von Ihnen erwähnten Kombinatoren untersuchen? – dsvensson
versuche vielleicht [ResultRow] anstelle von [Maybe ResultRow] – madnight