我有不幸数据一起工作:埃宋与数组的数组,其中一些是空
{ "name": "foo"
, "data": [ []
, ["a", "b", "c", 1]
, ["d", "e", "f", 2] ] }
条目允许为任一空数组,或大小的4的阵列中的数据。
,我想解析为:
data ResultRow = ResultRow Text Text Text Int deriving (Show, Generic)
data ResultSet =
ResultSet { f_name :: Text
, f_data :: [Maybe ResultRow] } deriving (Show, Generic)
但是以下不接受空数组:
customOptions = defaultOptions { fieldLabelModifier = drop 2 }
instance FromJSON ResultRow where
parseJSON = genericParseJSON customOptions
instance FromJSON ResultSet where
parseJSON = genericParseJSON customOptions
的错误信息是:
Left "Error in $[1].data[0]: When expecting a product of 4 values, encountered an Array of 0 elements instead"
我已经还尝试在[Maybe ResultRow]
附近添加一个额外的类型,并将子阵列转换为列表和pat tern匹配[]
,并将非空案例分配给ResultRow
解析器,但我根本无法将其编译并丢失在错误消息中。
理想情况下,我想有一些跳过空数组的方式,因为它们只是数据中的噪声。我无法控制数据的制作者。
在这种情况下,我不会使用通用的json解析器,而是使用来自aeson的组合器自己编写它! – epsilonhalbe
你是说这对于通用的json解析器来说是不可能的/不可行的,或者你只是不知道如何去做,因此在评论中而不是回答中推荐组合器?你有没有什么阅读材料可以用你提到的组合器来探索与我有些相似的数据? – dsvensson
尝试可能[ResultRow]而不是[可能ResultRow] – madnight