1

たとえば、いくつかのエンティティ(モジュール)を含むjsonファイルがあります:

{ 
    "name"  : "module1",
    "type"   : "Type1"
},

{
    "name"  : "module2",
    "type"   : "Type2"
}

そして、このjsonからデータ型モジュールを構築したい

data Module = Module {name::String, type :: ModuleType}

data ModuleType = Type1 | Type2

そのような種類のデータ型をjsonから構築する最も便利な方法は何ですか? カスタム タイプの Type1 と Type2 を解析し、変換して検証するにはどうすればよいですか? どんな助けでも大歓迎です=)

4

2 に答える 2

3

素晴らしいaesonモジュールを使用することをお勧めします。非常に高速で理解しやすく、解析ロジックをすばやく開発できます。ページの冒頭にもいくつかの例があり、コードでその例を 99% 使用できます。

instance FromJSON Module where
    parseJSON (Object v) = build <$>
                           v .: "name" <*>
                           v .: "type"
    -- A non-Object value is of the wrong type, so fail.
    parseJSON _          = mzero

build :: String -> String -> Module
build name "Type1" = Module name Type1
build name "Type2" = Module name Type2
于 2013-09-23T20:20:29.957 に答える
0

理想的には、データ型の独自のFromJSONインスタンスを作成する必要があります。ModuleType

instance FromJSON Module where
    parseJSON (Object v) = Module <$>
                           v .: "name" <*>
                           v .: "type"
    parseJSON _          = mzero

instance FromJSON ModuleType where
    parseJSON (String t) = case t of
                               "Type1" -> return Type1
                               "Type2" -> return Type2
                               _       -> mzero
    parseJSON _          = mzero

このようにしてnon-exhaustive pattern、誰かがあなたに次のような文字列を与えたときに、(Mihai のソリューションで発生する可能性があるように) エラーに遭遇しません。

{ "name": "module1", "type": "unconventional-type" }

デコードします。

于 2014-03-31T23:52:29.773 に答える