タイプの値をパッケージDistribution.PackageDescription.FlagName
のを使用してJSONオブジェクトに変換する必要がありText.JSON
ます。
私は次のアプローチに行き着きました: json
instance JSON FlagName where
showJSON (FlagName n) = makeObj [ ("FlagName", showJSON n) ]
readJSON object = do
obj <- readJSON object
flag <- valFromObj "FlagName" obj
return flag
値をエンコードして再度デコードしようとすると、次のようになります。
> showJSON (FlagName "foo")
JSObject (JSONObject {fromJSObject = [("FlagName",JSString (JSONString {fromJSString = "foo"}))]})
> readJSON (showJSON (FlagName "foo")) :: Result FlagName
Error "Unable to read JSObject"
エラーはその行にあると思います: Haskellにインスタンスの関数obj <- readJSON object
を使用させるにはどうすればよいですか?readJSON
JSON String
更新:私は今ややハックな解決策を見つけました:
instance JSON FlagName where
showJSON (FlagName n) = makeObj [ ("FlagName", showJSON n) ]
readJSON object = do
obj <- readJSON (showJSON (FlagName "foo")) :: Result (JSObject JSValue)
let maybeFlagName = lookup "FlagName" $ fromJSObject obj
maybe (fail "Not a FlagName object") (\jsn -> liftM FlagName $ (readJSON jsn :: Result String)) maybeFlagName
誰かがもっとエレガントな解決策を思いついたら、それをいただければ幸いです...