JSON解析困惑
我正在研究json服务器的I/O方面,有一种方法我就是搞不好。 首先,我将给出错误,然后给出所涉及的代码和数据类型,以及之后关于该问题的一些注释JSON解析困惑,json,haskell,yesod,Json,Haskell,Yesod,我正在研究json服务器的I/O方面,有一种方法我就是搞不好。 首先,我将给出错误,然后给出所涉及的代码和数据类型,以及之后关于该问题的一些注释 (“X-Response-Body-Start”,“\n无效参数无效参数当需要一个单元构造函数(U1)时,反而遇到了字符串”” 期待单位承建商 好的,这里有一些相关的代码。让我们看看能不能看出我错在哪里 来自数据类型.hs data JobID = JobID Project Int deriving Generic data Project = B
(“X-Response-Body-Start”,“\n无效参数无效参数- 当需要一个单元构造函数(U1)时,反而遇到了字符串”
”
期待单位承建商
好的,这里有一些相关的代码。让我们看看能不能看出我错在哪里
来自数据类型.hs
data JobID = JobID Project Int deriving Generic
data Project = BNAP deriving (Show,Generic) -- one day to be an ADT
instance ToJSON Project where
toJSON = toJSON . show
instance FromJSON Project
instance FromJSON JobID
instance ToJSON JobID
测试代码
testReadR :: IO Value
testReadR = do
req <- parseUrl readURI
manager <- newManager def
pBody <- runResourceT $ do
reqBody <- readObject
liftIO $ print reqBody
Response _ _ _ body <- http (buildReq req reqBody) manager
pBody <- body $$+- sinkParser json
return pBody -- (return wraps it up)
closeManager manager
return pBody
buildReq :: forall a (m :: * -> *) (t :: * -> *).
ToJSON a =>
Request t -> a -> Request m
buildReq req reqBody =
let reqBodyBS = Data.Aeson.encode reqBody
rHeaders = [(hContentType,pack "application/json")]
in req {method = fromString "POST"
, requestBody = RequestBodyLBS reqBodyBS
,requestHeaders=rHeaders
}
readObject :: ResourceT IO Value
readObject = do -- I took a bunch out because I thought simplifiying would help me
-- solve this
return $ Data.Aeson.toJSON $ JobID BNAP 306
这里的挑战是Project
是一元类型。我研究的例子似乎都没有提到这一点。但我知道p是一个文本
,而toJSON
可以从中生成一个值
,而parseJSON
可以从值
生成一个解析器
。所以一切都很好,好吗?好吧,我仍然得到上面的错误,这是没有任何信息。有什么想法吗
instance ToJSON Project where
toJSON = toJSON . show
instance FromJSON Project
这些实例不能一起工作。通用FromJSON
实例需要通用单元构造函数U1
,但ToJSON
实例生成一个字符串“BNAP”
如果您有一个手写的ToJSON
实例,那么您还需要一个手写的FromJSON
实例
test: ResponseTimeout
instance FromJSON Project where
parseJSON (String p) = parseJSON $ toJSON p
parseJSON _ = mzero
p
是一个文本
,我们有
instance ToJSON Text where
toJSON = String
因此,上面的Project
实例循环,因为它扩展了parseJSON(String p)=parseJSON(String p)
就目前的类型而言
instance FromJSON Project where
parseJSON (String "BNAP") = return BNAP
parseJSON _ = mzero
如果启用了重载字符串,则应能正常工作,如果未启用
instance FromJSON Project where
parseJSON (String p)
| p == pack "BNAP" = return BNAP
parseJSON _ = mzero
用我认为可以解决您当前问题的方法更新我的答案。
instance FromJSON Project where
parseJSON (String "BNAP") = return BNAP
parseJSON _ = mzero
instance FromJSON Project where
parseJSON (String p)
| p == pack "BNAP" = return BNAP
parseJSON _ = mzero