我想用模式验证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
。
答案 0 :(得分:5)
Haskell一无所知。
您的架构在顶层没有required
属性,因此可以接受空的json对象。
它也不包含"additionalProperties": false
属性,因此忽略任何不适合其中一个定义模式的属性。
BTW我怀疑它是否是一个有效的Draft4 json架构。它通过了Draft4元模式的验证,但语法略有不同,可能是Python特有的。您最好运行与hjsonscheme
包一起提供的测试套件,看看是否一切正常。