gpt4 book ai didi

haskell - Aeson 解析为多个构造函数

转载 作者:行者123 更新时间:2023-12-02 17:17:00 25 4
gpt4 key购买 nike

我正在尝试解析 JSON 以生成具有多个构造函数的类型。挑战在于该类型以包含所需数据的键的名称进行编码。理论上,我可以使用一堆 .:? 调用,然后检查给定的键是否返回 Just 但我认为必须有更好的方法。我查看了 asum 但这对我没有多大帮助(可能是因为我对它不熟悉)。

import Data.Aeson
import Data.Time.Clock

data Request = Req1 { id :: String, properties :: Value }
| Req2 { id :: String, properties :: Value }
| Req3 { id :: String, time :: UTCTime }

instance FromJSON Request where
parseJSON = withObject "message" $ \o ->
-- ???

示例请求:

{"req1": {"id": "345", "p1": "v1", "p2": "v2"}}

{"req2": {"id": "654", "p3", "v3"}}

{"req3": {"id": "876", "time": 1234567890}}

最佳答案

以下是手动检查对象的方法:

{-# LANGUAGE OverloadedStrings #-}

import Data.Aeson
import Data.Time.Clock
import qualified Data.HashMap.Strict as H
import Control.Monad

type Val = Int

data Request = Req1 { id :: String, properties :: Val }
| Req2 { id :: String, properties :: Val }
| Req3 { id :: String, time :: UTCTime }

instance FromJSON Request where
parseJSON (Object v) =
case H.lookup "req1" v of
Just (Object h) -> Req1 <$> h .: "id" <*> h .: "properties"
Nothing ->
case H.lookup "req2" v of
Just (Object h) -> Req2 <$> h .: "id" <*> h .: "properies"
Nothing ->
case H.lookup "req3" v of
Just (Object h) -> Req3 <$> h .: "id" <*> h .: "time"
Nothing -> mzero

如果键 req1 存在,它将假定它是 Req1 值;否则,如果键 req2 存在,它将尝试将其解析为 Req2 值;对于req3等。如果这些键都不存在,它将失败。

您还可以使用 fail "..." 代替 mzero 来显示自定义错误消息。

关于haskell - Aeson 解析为多个构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37257514/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com