Aeson ile uğraşırken biraz zaman geçirdim, ancak Cebirsel Veri Türlerini güzel bir şekilde serileştiremiyorum. Ben denedim neAeson kullanarak Haskell ADT'lerini düzenli JSON olarak nasıl derleriz?
geçerli:
data Attach = Attach { tel :: String }
deriving (Show)
$(deriveJSON defaultOptions ''Attach)
data Fix = Fix { lat :: Double, lng :: Double }
deriving (Show)
$(deriveJSON defaultOptions ''Fix)
data MsgIn = AttachMsg Attach
| FixMsg Fix
deriving (Show)
$(deriveJSON defaultOptions ''MsgIn)
data MsgIn2 = MsgIn2 { attach :: Maybe Attach, fix :: Maybe Fix }
deriving (Show)
$(deriveJSON defaultOptions ''MsgIn2)
someFunc :: IO()
someFunc = do
let attach = Attach "+447890"
let reply = AttachMsg attach
BL.putStrLn (encode reply)
let reply2 = MsgIn2 (Just attach) Nothing
BL.putStrLn (encode reply2)
çıktısı:
{"tag":"AttachMsg","contents":{"tel":"+447890"}}
{"attach":{"tel":"+447890"},"fix":null}
aradığım çıktısı:
{"attach":{"tel":"+447890"}}
ama MsgIn
türünden MsgIn2
yerine.
MsgIn2
çıkışı oldukça yakın alır, ama açık bir
null
var.)
Aeson içinde bunu yapmanın bir yolu var mı?
Güncelleme:
ekledim: {"attach":{"tel":"+447890"}}
:
instance ToJSON MsgIn3 where
toJSON (AttachMsg3 (Attach tel)) = object ["attach" .= object ["tel" .= tel]]
...
let reply3 = AttachMsg3 attach
BL.putStrLn (encode reply3)
ve istediğim cevabı aldım.
@bheklilr, yeniden tanımlamak yerine Attach'in (önceden tanımlanmış) serileştirme yöntemini kullanmanın bir yolu var mı?
bazı saçma sözdizimi denedim ama anlaşılır derlenemeyecektir.Ancak değildir:
instance ToJSON MsgIn3 where
toJSON (AttachMsg3 (Attach tel)) = object ["attach" .= (toJSON :: Attach)]
"ToJSON" ve "FromJSON" örneklerini tam olarak istediğiniz şeyi elde etmek için yazabilirsiniz: 'toJSON (AttachMsg (Attach tel)) = object [" attach ". = Object [" tel ". = Tel] ] 've benzer şekilde FixMsg' için. ParseJSON uygulaması çok daha zor olmaz. – bheklilr
@bheklilr Teşekkürler, bu gerçekten yararlı oldu. Bunu bir cevap haline getirebilir misin?Güncellenmiş sorumu görebiliyor musunuz? – fadedbee