Data.Aeson 附加字段的占位符
Placeholder for additional fields with Data.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 字段的顺序。
当然 - 只需将对象存储在 additionalFields(第四个插槽)中:
instance FromJSON MyObject where
parseJSON obj@(Object v) = MyObject <$>
v .: "a" <*>
v .: "b" <*>
v .: "c" <*>
(pure obj)
parseJSON _ = mzero
如果要先删除 a
、b
和 c
的密钥,请使用:
import Data.HashMap.Strict as HM
...
pure ( HM.delete "a" $ HM.delete "b" $ HM.delete "c" obj )
假设我得到一个 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 字段的顺序。
当然 - 只需将对象存储在 additionalFields(第四个插槽)中:
instance FromJSON MyObject where
parseJSON obj@(Object v) = MyObject <$>
v .: "a" <*>
v .: "b" <*>
v .: "c" <*>
(pure obj)
parseJSON _ = mzero
如果要先删除 a
、b
和 c
的密钥,请使用:
import Data.HashMap.Strict as HM
...
pure ( HM.delete "a" $ HM.delete "b" $ HM.delete "c" obj )