Итак, я ударил что-то вроде блокпоста с разбором следующего JSON с библиотекой Haskell Aeson.Разбор вложенных гетерогенных массивов JSON с помощью Aeson
Так что у меня есть следующие:
"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...
А я бы в идеале хотел бы разобрать это, используя типы данных, как это:
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
И получить что-то вроде следующего:
ExtractedPacket
"packetX_Name"
[ ExtractedPacketField "value1" "value2"
, ExtractedPacketField "value3" "value4"
, ExtractedPacketField "value5" "value6"
]
ExtractedPacket
"packetY_Name"
[ ExtractedPacketField "value7" "value8"
, ExtractedPacketField "value10" "value10"
]
В этом примере JSON описываются сетевые пакеты, и каждый пакет имеет другое имя (например, «пакет X» _Name "), который не может быть проанализирован так же, как и поле« 1 »или« поле2 ». Все будет по-разному. Большинство примеров Aeson там совершенно бесполезны, когда дело доходит до таких ситуаций. Я заметил эту функцию в документации API под названием withArray
, что соответствует на String
, но я на проигрыш, как к тому, что использовать для (Array -> Parser a)
Часть, я действительно застрял на разборе является гетерогенный массив, начинается с String «container», а затем имеет массив со всеми объектами в нем. До сих пор я индексировал прямо к массиву объектов, но система типов начала становиться настоящим лабиринтом, и мне было очень трудно подойти к этому способом, который не является уродливым и хакерским. Кроме того, Aeson не создает очень полезные сообщения об ошибках.
Любые идеи о том, как подойти к этому?
Да, это работает и для меня. Спасибо! Это одно из более прохладных способов использования списков, которые я видел до сих пор.Раньше я играл с Vectors и HashMaps, но типы были бы выведены в Value так, как мне трудно было отлаживать. – carpemb