So, ich habe etwas von einem Roadblock mit Parsing der folgenden JSON mit der Haskell Aeson-Bibliothek getroffen.Verschachtelte verschachtelte heterogene JSON-Arrays mit Aeson
So sagen, ich habe folgendes:
"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...
Und ich würde im Idealfall möchte dies mit Datentypen wie folgt analysieren:
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
Und so etwas wie die folgenden erhalten:
ExtractedPacket
"packetX_Name"
[ ExtractedPacketField "value1" "value2"
, ExtractedPacketField "value3" "value4"
, ExtractedPacketField "value5" "value6"
]
ExtractedPacket
"packetY_Name"
[ ExtractedPacketField "value7" "value8"
, ExtractedPacketField "value10" "value10"
]
Dieses JSON-Beispiel beschreibt Netzwerkpakete und jedes Paket hat einen anderen Namen (z. B. "packetX _Name "), die nicht auf die gleiche Weise geparst werden kann" field1 "oder" field2 ". Es wird jedes Mal anders sein. Die meisten der Aeson-Beispiele da draußen sind ziemlich wenig hilfreich, wenn es um solche Situationen geht. Ich habe eine Funktion in der API-Dokumentation bemerkt withArray
genannt, die auf einem String
passt, aber ich bin an einem verlieren, was für (Array -> Parser a)
Der Teil I auf bin stecken wirklich zu verwenden, um die heterogene Array Parsen, dass beginnt mit einem String- "Container" und hat dann ein Array mit allen Objekten darin. Bis jetzt habe ich direkt auf die Anordnung von Objekten getippt, aber das Typsystem fing an, ein echtes Labyrinth zu werden und ich fand es wirklich schwierig, sich diesem auf eine Art und Weise zu nähern, die nicht hässlich und hackisch ist. Darüber hinaus liefert Aeson keine sehr hilfreichen Fehlermeldungen.
Irgendwelche Ideen, wie man das angeht?
Ja, das funktioniert auch für mich. Vielen Dank! Das ist eine der cooleren Anwendungen von Listen-Comprehensions, die ich bisher gesehen habe.Ich habe vorher mit Vectors und HashMaps experimentiert, aber die Typen würden auf Value zurückgeführt, auf eine Art und Weise, die ich schwer zu debuggen fand. – carpemb