1

「プロパティ」フィールドを持つjson-schemaファイルがあります。

{
...
   "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時間の睡眠の後、私はついに問題が何であるかを理解しました! 私のスキーマには field がありますが"type": ["string", "null"]、パーサーは「タイプ」が文字列であると想定しています。助けてくれてありがとう:)

4

0 に答える 0