2014-09-19 93 views
2

我正在使用yaml軟件包將.yaml文件解析爲Haskell data結構。由於我有相當多的data對象,我正在使用泛型來避免每次都寫「解析器」。這看起來有點像在Haskell中使用aeson的泛型解析器進行嚴格的yaml解析

instance ToJSON MyData where 
toJSON = genericToJSON defaultOptions 

然而,分析是不是「嚴」就夠了,即解析器靜默忽略存在於.yaml文件,但沒有在data結構的對應字段。如果.yaml文件中存在「未知」鍵,是否有觸發某種錯誤的簡單方法?

回答

2

此功能絕對不存在於yaml本身,因爲yaml不提供用於派生ToJSONFromJSON實例的任何代碼。據我所知,aeson沒有提供你想要的功能。如果爲true,則必須手動編寫實例。

-1

下面是我爲解決問題而編寫的代碼的簡化版本。通過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