【发布时间】:2018-12-08 08:26:21
【问题描述】:
当尝试使用 Aeson 解析一些简单的 JSON 时,我收到一个我不理解的类型错误。我有以下 JSON
jsonString = "[\"a\", [\"b\", \"c\"]]" :: L.ByteString
我已经定义了以下导入和代码:
import Data.Aeson
import GHC.Generics
import qualified Data.ByteString.Lazy as L
data Ch = Ch {
c1 :: String,
c2 :: (String, String)
} deriving (Show, Generic)
instance FromJSON Ch
当我尝试在此字符串上使用 eitherDecode 和我的 Ch 类型时,我得到一个错误
*Aeson> eitherDecode jsonString :: Either String Ch
Left "Error in $: expected record (:*:), encountered Array"
有人能解释一下这个错误并告诉我应该如何解析这个 JSON 吗?
一种可行的方法是
eitherDecode jsonString :: Either String (String, (String, String))
但我宁愿直接去我的类型。
【问题讨论】:
-
这不是类型错误,这只是运行时错误,告诉您
[ "a", [ "b", "c" ] ]json 与您刚刚定义的解析器所期望的值不同,{ "c1" : "some string", "c2" : ["string", "string"] }。如果你想解析通用实例定义之外的东西,那么你需要手动定义它。