如何在Haskell中使用模式验证JSON?

时间:2016-02-08 04:18:35

标签: json validation haskell

我想用模式验证JSON。 hjsonschema似乎是一个不错的选择,因为它相当新,并支持最新的草案。 但是plotly json schema总是给我有效的答复。

我可能在这里误解了一些东西,但这不应该是有效的JSON

bad.json

{
    "fjsdklj" : 5
}

即使以下代码认为它有效

module Main where

import           Control.Applicative
import           Data.Aeson
import           Data.HashMap.Strict (HashMap)
import qualified Data.HashMap.Strict as H
import           Data.Monoid
import qualified Data.ByteString.Lazy as B
import qualified Data.JsonSchema as JS
import Data.Maybe

main :: IO ()
main = do
    schemaJSON <- (fromJust . decode) <$> B.readFile "simple-schema.json"
    bad <- (fromJust . decode) <$> B.readFile "bad.json"
    let schemaData = JS.RawSchema {
                        JS._rsURI = Nothing,
                        JS._rsData = schemaJSON
                        }
    schema <- compileSchema (JS.SchemaGraph schemaData H.empty) schemaData
    checkResults (JS.validate schema bad)

compileSchema :: JS.SchemaGraph -> JS.RawSchema -> IO (JS.Schema JS.Draft4Failure)
compileSchema graph rs =
  case JS.compileDraft4 graph rs of
    Left failure -> error $ "Not a valid schema: " <> show failure
    Right schema -> return schema

checkResults :: [JS.ValidationFailure JS.Draft4Failure] -> IO ()
checkResults [] = putStrLn "Just fine"
checkResults x = putStrLn $ "ERROR: " ++ show x

simple-schema.json是我在上面发布的剧情架构和bad.json

1 个答案:

答案 0 :(得分:5)

Haskell一无所知。

您的架构在顶层没有required属性,因此可以接受空的json对象。

它也不包含"additionalProperties": false属性,因此忽略任何不适合其中一个定义模式的属性。

BTW我怀疑它是否是一个有效的Draft4 json架构。它通过了Draft4元模式的验证,但语法略有不同,可能是Python特有的。您最好运行与hjsonscheme包一起提供的测试套件,看看是否一切正常。