Parsing 使用aeson'的严格yaml解析;Haskell中的泛型解析器
我正在使用包解析.yaml文件到HaskellParsing 使用aeson'的严格yaml解析;Haskell中的泛型解析器,parsing,haskell,yaml,Parsing,Haskell,Yaml,我正在使用包解析.yaml文件到Haskell数据结构。因为我有相当多的数据对象,所以我使用泛型来避免每次编写“解析器”。这看起来像 instance ToJSON MyData where toJSON = genericToJSON defaultOptions 但是,解析不够“严格”,即解析器会自动忽略.yaml文件中存在的字段,但在数据结构中没有对应关系。如果.yaml文件中存在“未知”键,是否有一种简单的方法可以触发某种错误?此功能在yaml本身中肯定不存在,因为yaml不提供任何
数据
结构。因为我有相当多的数据
对象,所以我使用泛型来避免每次编写“解析器”。这看起来像
instance ToJSON MyData where
toJSON = genericToJSON defaultOptions
但是,解析不够“严格”,即解析器会自动忽略.yaml文件中存在的字段,但在
数据
结构中没有对应关系。如果.yaml文件中存在“未知”键,是否有一种简单的方法可以触发某种错误?此功能在yaml
本身中肯定不存在,因为yaml不提供任何用于派生ToJSON
和FromJSON
实例的代码。据我所知,aeson
没有提供您所需要的功能。如果为true,则必须手动编写实例。下面是我为解决此问题而编写的代码的简化版本。使用viaparseJSON=strictParseYaml
import Data.HashMap.Strict (member,insert,keys)
strictParseYaml xs =
do
parsed <- genericParseJSON defaultOptions xs
let diff = minus (keysOfValue xs) (keysOfData parsed)
return $
if diff == [] then
parsed
else
error $ "Found unknown keys: " ++ show diff
where
keysOfData u = sort $ constrFields $ toConstr u
keysOfValue :: Value -> [String]
keysOfValue (Object xs) = sort $ map unpack $ keys xs
import Data.HashMap.Strict(成员、插入、键)
严格解析YAML xs=
做
已解析[字符串]
keysOfValue(objectxs)=排序$map解包$keys xs