Aeson:将嵌套对象解析为(Map String MyShinyType)

时间:2013-11-07 16:01:18

标签: json haskell aeson

我的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。谢谢大家的帮助:)

0 个答案:

没有答案