J'ai donc rencontré un problème de roadblock avec l'analyse du fichier JSON suivant avec la bibliothèque Haskell Aeson.Analyse de tableaux JSON hétérogènes imbriqués avec Aeson
dire Je donne les résultats suivants:
"packetX_Name": [
"container",
[
{
"field1": "value1",
"field2": "value2"
},
{
"field1": "value3",
"field2": "value4"
},
{
"field1": "value5",
"field2": "value6"
}
]
],
"packetY_Name": [
"container",
[
{
"field1": "value7",
"field2": "value8"
},
{
"field1": "value9",
"field2": "value10"
}
]
],
etc...
Et je voudrais idéalement analyser cela en utilisant des types de données comme ceci:
data ExtractedPacket = ExtractedPacket
{ packetName :: String
, packetFields :: [ExtractedPacketField]
} deriving (Show,Eq)
instance FromJSON ExtractedPacket where
parseJSON = blah
data ExtractedPacketField = ExtractedPacketField
{ field1 :: String
, field2 :: String
} deriving (Show,Eq)
instance FromJSON ExtractedPacketField where
parseJSON = blah
Et obtenir quelque chose comme ce qui suit:
ExtractedPacket
"packetX_Name"
[ ExtractedPacketField "value1" "value2"
, ExtractedPacketField "value3" "value4"
, ExtractedPacketField "value5" "value6"
]
ExtractedPacket
"packetY_Name"
[ ExtractedPacketField "value7" "value8"
, ExtractedPacketField "value10" "value10"
]
Cet exemple JSON décrit des paquets réseau et chaque paquet porte un nom différent (par exemple "packetX" _Name ") qui ne peut pas être analysé de la même manière que" field1 "ou" field2 ". Ce sera différent à chaque fois. La plupart des exemples d'Aeson sont très peu utiles dans des situations comme celle-ci. Je l'ai remarqué une fonction dans la documentation de l'API appelée withArray
qui correspond à un String
, mais je suis à perdre à ce qu'il faut utiliser pour (Array -> Parser a)
La partie que je suis vraiment coincé sur le tableau est l'analyse hétérogène commence par un "conteneur" String, puis a un tableau avec tous les objets qui s'y trouvent. Jusqu'à présent, j'ai indexé directement sur le tableau des objets, mais le système de types a commencé à devenir un vrai labyrinthe et j'ai trouvé très difficile d'aborder ce problème d'une manière qui n'est pas laide et hachée. En plus de cela, Aeson ne produit pas de messages d'erreur très utiles.
Des idées sur la façon d'aborder cela?
Oui, cela fonctionne pour moi aussi. Je vous remercie! C'est l'une des utilisations les plus cool de la compréhension des listes que j'ai vu jusqu'ici.Je travaillais avec Vectors et HashMaps auparavant, mais les types seraient déduits de Value d'une manière que je trouvais difficile à déboguer. – carpemb