【问题标题】:Strict yaml parsing using aeson's generic parser in Haskell在 Haskell 中使用 aeson 的通用解析器进行严格的 yaml 解析
【发布时间】:2014-09-19 20:02:47
【问题描述】:

我正在使用 yaml 包将 .yaml 文件解析为 Haskell data 结构。因为我有很多data 对象,所以我使用泛型来避免每次都编写“解析器”。这看起来像

instance ToJSON MyData where
 toJSON = genericToJSON defaultOptions

但是解析不够“严格”,即解析器会默默地忽略 .yaml 文件中存在但在 data 结构中没有对应关系的字段。如果 .yaml 文件中存在“未知”键,是否有一种简单的方法可以触发某种错误?

【问题讨论】:

    标签: parsing haskell yaml


    【解决方案1】:

    yaml 本身绝对不存在此功能,因为 yaml 不提供任何代码来派生 ToJSONFromJSON 实例。据我所知,aeson 没有提供您正在寻找的功能。如果为 true,则必须手动编写实例。

    【讨论】:

      【解决方案2】:

      下面是我为解决问题而编写的代码的简化版本。通过parseJSON = 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多