Data.Aeson的其他字段的占位符

时间:2016-06-08 09:34:53

标签: haskell aeson

我们说我得到了一个JSON,其中包含一些我知道的字段以及一些我不知道的字段:

{
  "a": { ... },
  "b": { ... },
  "c": { ... },
  "something": "else",
  "more": {"of": ["the", "same"]},
  "and": ["even", "some", "more"]
}

由于JSON结构有点复杂,我真的希望使用以下数据在Haskell中使用它:

data A = ...
data B = ...
data C = ...
data MyObject = MyObject
  {
    a :: A
  , b :: B
  , c :: C
  , additionalFields :: Object
  }

是否可以将字段a,b和c转换为Haskell对象,并将所有其他字段打包并作为Aeson.Object传递?

另外,我不保证JSON字段的顺序。

1 个答案:

答案 0 :(得分:5)

当然 - 只需将Object存储在additionalFields(第四个插槽)中:

instance FromJSON MyObject where
    parseJSON obj@(Object v) = MyObject  <$>
        v .: "a"                         <*>
        v .: "b"                         <*>
        v .: "c"                         <*>
        (pure obj)
    parseJSON _                      = mzero

如果您想首先删除abc的密钥,请使用:

import Data.HashMap.Strict as HM

...

   pure ( HM.delete "a" $ HM.delete "b" $ HM.delete "c" obj )