j'ai les données malheureux de travailler avec:Aeson avec des tableaux de tableaux, dont quelques-uns sont vides
{ "name": "foo"
, "data": [ []
, ["a", "b", "c", 1]
, ["d", "e", "f", 2] ] }
Les données entrées sont autorisées à être soit un tableau vide, ou un tableau de taille quatre.
que je veux analyser dans:
data ResultRow = ResultRow Text Text Text Int deriving (Show, Generic)
data ResultSet =
ResultSet { f_name :: Text
, f_data :: [Maybe ResultRow] } deriving (Show, Generic)
Voici cependant ne pas accepter les tableaux vides:
customOptions = defaultOptions { fieldLabelModifier = drop 2 }
instance FromJSON ResultRow where
parseJSON = genericParseJSON customOptions
instance FromJSON ResultSet where
parseJSON = genericParseJSON customOptions
Le message d'erreur est:
Left "Error in $[1].data[0]: When expecting a product of 4 values, encountered an Array of 0 elements instead"
J'ai aussi essayé de mettre un type supplémentaire autour de [Maybe ResultRow]
et ont que convertir les sous-tableaux en listes et pat tern correspond à []
, et envoie le cas non-vide à l'analyseur ResultRow
mais je n'ai tout simplement pas pu le compiler et je me suis perdu dans les messages d'erreur.
Idéalement, je voudrais avoir un moyen de sauter les tableaux vides car ils ne sont que du bruit dans les données. Je n'ai aucun contrôle sur le producteur des données.
Dans ce cas, je n'utiliserais pas l'analyseur json générique, mais je l'écrirais moi-même en utilisant les combinateurs d'Aeson! – epsilonhalbe
Etes-vous en train de dire que c'est impossible/irréalisable avec l'analyseur json générique, ou vous ne savez pas comment le faire et donc recommander les combinateurs dans un commentaire plutôt que d'une réponse? Avez-vous du matériel de lecture à suggérer qui explore des données similaires à celles que j'ai, en utilisant les combinateurs que vous mentionnez? – dsvensson
try Peut-être [ResultRow] au lieu de [Maybe ResultRow] – madnight