RESTサーバーから複雑な形式のJSON応答を使用しています。それらをデコードするには、さまざまなネストされたオブジェクトを処理するための2つのデータ型があります。例:Aesonは文字列またはintのいずれかのJSONオブジェクトをデコードします
... Other types ...
data Profile =
Profile { fields :: [KVPair]
} deriving (Show)
instance FromJSON Profile where
parseJSON (Object v) =
Profile <$> v .: "Fields"
parseJSON _ = mzero
data KVPair =
KVPair { key :: Int
, value :: String
} deriving (Show)
instance FromJSON KVPair where
parseJSON (Object v) =
KVPair <$> v .: "Key"
<*> v .: "Value"
parseJSON _ = mzero
最終的なKVPairタイプ以外はすべて動作します。 JSONオブジェクトにはすべて整数キーがあります。ただし、値は、整数または文字列になります
{
"Key": 0,
"Value": "String Value!"
},
{
"Key": 1,
"Value": 42
}
は今、私はString
とInt
で構成され、私の価値デコードに別の合計の種類を追加することができると仮定したが、私は全体を追加しないことを好むだろうそのための新しいタイプ。 Aesonはこのシナリオを処理する簡単な方法はありますか?
代替構文解析メソッドが正しく理解されていれば、整数値を文字列型に変換するだけでしょうか? "Value":3はKVPair {value = "3"}のようなものに変換されますか? – jkeuhlen
@jkeuhlen正確には、 "強制"はここには適用されないハスケルの特定の意味を持っています - "変換"または "かわいいプリント"は正解に近いでしょう。 –