Haskell linux上的yaml库不';t解码它的内容';s编码
解码/编码:Haskell linux上的yaml库不';t解码它的内容';s编码,haskell,yaml,Haskell,Yaml,解码/编码: yDecode :: FromJSON iFromJSONable ⇒ FilePath → IO iFromJSONable yDecode fnm = do ymlData ← BS.readFile fnm return $ fromMaybe (error "Can't parse from YAML") (decode ymlData) yEncode :: ToJSON iToJSONable ⇒ FilePath → iToJSONable → IO() y
yDecode :: FromJSON iFromJSONable ⇒ FilePath → IO iFromJSONable
yDecode fnm = do
ymlData ← BS.readFile fnm
return $ fromMaybe (error "Can't parse from YAML") (decode ymlData)
yEncode :: ToJSON iToJSONable ⇒ FilePath → iToJSONable → IO()
yEncode fnm dat = BS.writeFile fnm $ encode dat
我用这个编码创建了配置,它创建得很好,但是当我阅读它时,我得到了这个错误:
无法从YAML进行解析
-在windows上,相同的代码工作正常,我只是不明白可能有什么错?在什么都没有的情况下,最好使用decodeother
/decodeother'
获取更多信息。任一值的左侧都将包含一条错误消息,告诉您故障发生的位置。如果切换,您将看到解析失败,原因是错误“无法从YAML解析存储库”
行(请参阅下面的attempt1
)。它遇到的不仅仅是一个物体
然后最好通过解码到我们知道必须成功的类型——Value,来了解YAML包到底解码到了什么。解码时,我们得到以下结果(请参见下面的attempt2
):
根数据结构似乎是数组而不是对象。有很多方法可以解决这个问题,我选择了一个很有技巧的方法
parseJSON (Array array) = parseJSON (array ! 0)
这使程序工作!我把代码贴在下面。(对于使用lens表示歉意;我使用它在字符串和bytestring之间进行转换,以获得类似这样的快速脚本。没有它,您的程序当然可以正常工作。)
{-#语言重载字符串}
模块库在哪里
进口管制.镜头
导入数据.ByteString
导入Data.ByteString.Lens
导入数据。矢量
导入数据.Yaml
数据存储库=存储库
{location::String
,任务::字符串
,分支::[字符串]
,上游::字符串
,enabled::可能是Bool
可能是布尔
可能是布尔
可能是布尔
,postRebuild::Maybe[String]
,syncGroup::可能是字符串
,hash::可能是字符串
}推导(显示,等式)
来自JSON存储库的实例,其中
parseJSON(对象v)=存储库
v.:“地点”
v.:“任务”
v.:“分支机构”
v.:“上游”
v.:?“启用”
v.:?“根”
v.:?“积极的”
v.:?“干净”
v.:?“重建后”
v.:?“组”
v.:?“散列”
parseJSON(数组)=parseJSON(数组!0)
原始::字符串
原始=未线[
“-组:空”,
“分行:”,
“-主人”,
“哈希:null”,
“清除:空”,
“地点:/home/gentoo haskell”,
“已启用:空”,
“root:null”,
“重建后:空”,
“上游:上游主节点”,
“任务:重设基础”,
“正:空”]
attempt1::ParseException存储库
attempt1=DecodeOr'(原始包装)
attempt2::ParseException值或
attempt2=DecodeOr'(原始包装)
也许这是一个愚蠢的行尾问题——YAML文件是什么样子的?您可以尝试将其复制并粘贴到新文件(在linux上)并重试吗?@Carsten复制和粘贴即使我从windows复制配置也不起作用,但确实[]
config可以工作/btw目前不确定,但看起来windows正在使用LF
,linux正在使用CRLF
那里:S[]
作为空文件。。。如果你不告诉我们更多关于文件和你最终解码的类型的细节,那真的很难说into@Carsten[]是空的yaml配置。这是粘贴文件和配置我的实际错误有未能解析字段启用:预期为Bool,遇到Null
,我仍然不确定原因是什么:/bug with maybies?-应该是相关的,但目前还不能深入实际问题
parseJSON (Array array) = parseJSON (array ! 0)
{-# LANGUAGE OverloadedStrings #-}
module Lib where
import Control.Lens
import Data.ByteString
import Data.ByteString.Lens
import Data.Vector
import Data.Yaml
data Repository = Repository
{ location :: String
, task :: String
, branches :: [String]
, upstream :: String
, enabled :: Maybe Bool
, root :: Maybe Bool
, positive :: Maybe Bool
, clean :: Maybe Bool
, postRebuild :: Maybe [String]
, syncGroup :: Maybe String
, hash :: Maybe String
} deriving (Show, Eq)
instance FromJSON Repository where
parseJSON (Object v) = Repository <$>
v .: "location" <*>
v .: "task" <*>
v .: "branches" <*>
v .: "upstream" <*>
v .:? "enabled" <*>
v .:? "root" <*>
v .:? "positive" <*>
v .:? "clean" <*>
v .:? "postRebuild" <*>
v .:? "group" <*>
v .:? "hash"
parseJSON (Array array) = parseJSON (array ! 0)
raw :: String
raw = unlines [
"- group: null",
" branches:",
" - master",
" hash: null",
" clean: null",
" location: /home/gentoo-haskell",
" enabled: null",
" root: null",
" postRebuild: null",
" upstream: upstream master",
" task: rebase",
" positive: null"]
attempt1 :: Either ParseException Repository
attempt1 = decodeEither' (raw ^. packedChars)
attempt2 :: Either ParseException Value
attempt2 = decodeEither' (raw ^. packedChars)