I’ve been working on a very small program to grab details about Half Life 2 servers (using the protocol-srcds library). The workflow is pretty straightforward; it takes a list of servers from a file, queries each of them, and writes the output out to another file (which is read by a PHP script for display, as I’m tied to vBulletin). Would be nice if it was done in SQL or something, but seeing as I’m still just learning, that’s a step too far for now!
Anyway, my question relates to serialization, namely, serializing to JSON. For now, I’ve written a scrappy helper function jsonify, such that:
jsonify (Just (SRCDS.GameServerInfo serverVersion
serverName
serverMap
serverMod
serverModDesc
serverAppId
serverPlayers
serverMaxPlayers
serverBots
serverType
serverOS
serverPassword
serverSecure
serverGameVersioning)) =
toJSObject [ ("serverName", serverName)
, ("serverMap", serverMap)
, ("serverPlayers", show serverPlayers)
, ("serverMaxPlayers", show serverMaxPlayers) ]
(I’m using the Text.JSON package). This is obviously not ideal. At this stage, however, I don’t understand using instances to define serializers for records, and my attempts to do so met a wall of frustration in the type system.
Could someone please walk me through the “correct” way of doing this? How would I go about defining an instance that serializes the record? What functions should I use in the instance (showJSON?).
Thanks in advance for any help.
You might want to consider using
Data.Aesoninstead which might be regarded as the successor toText.JSON.With
aesonyou define separate instances for serialize/deserializing (withText.JSONyou have to define both directions even if you need only one, otherwise the compile will annoy you — unless you silence the warning somehow), and it provides a few operators making defining instances a bit more compact, e.g. the example from @hammar’s answer can be written a little bit less noisy as shown below with theaesonAPI: