我的json-schema文件带有“properties”字段。
{
...
"properties": {
"id": {
"description": "ID",
"type": "integer",
"required": true
},
...
}
}
正如您所看到的,属性不是数组,而是对象。我想用aeson解析这个结构Map String Schema
我的代码现在看起来像这样:
{-# LANGUAGE OverloadedStrings #-}
module GimmeModels.Schema.JSONSchema.Types
where
import Data.Aeson
import Control.Applicative ((<$>), (<*>), empty)
import Data.Attoparsec (parse, Result(..), IResult( Done ))
import Data.Text (Text)
import Control.Monad (mzero)
import qualified Data.ByteString.Char8 as BS
import qualified Data.ByteString.Lazy.Char8 as BSL
import qualified Data.Aeson.Types as T
import Data.Map (Map(..))
data Schema = Schema {
schema :: Maybe Text
, id :: Maybe Text
, _type :: Maybe Type
, description :: Maybe Text
, extends :: Maybe (Map String String)
, items :: Maybe Schema
, properties :: Maybe (Map String Schema)
, required :: Maybe Bool
} deriving (Show)
type SchemaUrl = Text
type Type = Text
type PropsMap = Map String Schema
instance FromJSON Schema where
parseJSON (Object v) =
Schema <$> v .:? "$schema"
<*> v .:? "id"
<*> v .:? "type"
<*> v .:? "description"
<*> v .:? "extends"
<*> v .:? "items"
<*> v .:? "properties"
<*> v .:? "required"
parseJSON _ = empty
parseSchemaFromString :: String -> Maybe Schema
parseSchemaFromString s =
case parse json bs of
(Done rest r) -> T.parseMaybe parseJSON r :: Maybe Schema
_ -> error "FAIL"
where bs = BS.pack s
它不起作用。 如果我打开Generics并自动派生FromJSON接口,Aeson将解析像魅力这样的属性,但我真的需要手工映射“$ schema”和“type”字段。
我该怎么做才能正确解析它?
伙计们,经过8个小时的睡眠,我终于意识到了什么问题!在我的模式中有字段"type": ["string", "null"]
,但解析器假定“type”是String。谢谢大家的帮助:)