Tom*_*Tom 2 validation json haskell
我想用模式验证JSON.hjsonschema似乎是一个不错的选择,因为它相当新,并支持最新的草案.但情节json架构总是给我有效的回应.
我可能在这里误解了一些东西,但这不应该是有效的JSON
bad.json
{
"fjsdklj" : 5
}
Run Code Online (Sandbox Code Playgroud)
即使它被以下代码认为是有效的
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
Run Code Online (Sandbox Code Playgroud)
simple-schema.json是bad.json我在上面发布的情节架构和片段.
这与Haskell无关.
您的架构required在顶层没有属性,因此可以接受空的json对象.
它也不包含任何"additionalProperties": false属性,因此忽略任何不适合其中一个已定义模式的属性.
顺便说一句,我怀疑它是否是一个有效的Draft4 json架构.它通过了Draft4元模式的验证,但语法略有不同,可能是Python特有的.你最好运行随hjsonscheme包附带的测试套件,看看是否一切正常.