gpt4 book ai didi

haskell - Aeson 解析动态对象

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

我需要解析没有严格结构的 json API 响应:

{
response: { /* any object here */ }
}

如何编写 parseResponse 来保留解析(或为其选择解析器)的能力以供以后使用?

我的最后一次尝试如下。我不喜欢它,因为它不允许像 Aeson 的 decode 那样选择响应类型。

data APIResponse =
APIResponse { response :: Value } deriving (Show,Generic)

instance FromJSON APIResponse

parseResponse :: BC.ByteString -> Either String Value
parseResponse resp =
case eitherDecode . BLC.fromStrict $ resp of
Right x -> Right $ response x
Left msg -> Left msg

最佳答案

我喜欢认为 Aeson 发生在两个不同的步骤中,从 ByteString -> Value 进行解析,以及从 FromJSON a => Value -> a 进行映射。如果您不能立即知道正确的映射是什么,您可以像您所做的那样简单地解析为 Value 。稍后在运行时,当您决定正确的映射时,您可以稍后再执行。

import qualified Data.HashMap.Strict as Hm

decodeResponse :: ByteString -> Either String Value
decodeResponse bs = do
val <- eitherDecode bs
case val of
Object o -> case Hm.lookup "response" o of
Nothing -> fail "Invalid structure, missing 'response' key"
Just resp -> return resp
_ -> fail "Invalid structure, expected an object"

要在不进行解析的情况下执行映射,将 Value 转换为 FromJSON a => a,请使用 parse/parseEither/parseMaybe 系列并运行由 parseJSON

生成的解析器
mapValue :: FromJSON a => Value -> Either String a
mapValue = parseString parseJSON

关于haskell - Aeson 解析动态对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22766899/

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