Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JSON解析困惑_Json_Haskell_Yesod - Fatal编程技术网

JSON解析困惑

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

我正在研究json服务器的I/O方面,有一种方法我就是搞不好。 首先,我将给出错误,然后给出所涉及的代码和数据类型,以及之后关于该问题的一些注释

(“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