deriveJsonNoPrefix: Derive ToJSON/FromJSON instances in a more prefix-friendly manner.

[ apache, data, development, library ] [ Propose Tags ]

Please see the README on GitLab at https://gitlab.com/igrep/deriveJsonNoPrefix#readme


[Skip to Readme]
Versions 0.1.0.0, 0.1.0.1
Change log ChangeLog.md
Dependencies aeson, base (>=4.7 && <5), template-haskell [details]
License Apache-2.0
Copyright 2018 Yuji Yamamoto
Author Yuji Yamamoto
Maintainer whosekiteneverfly@gmail.com
Category Data
Home page https://gitlab.com/igrep/deriveJsonNoPrefix
Source repo head: git clone https://gitlab.com/igrep/deriveJsonNoPrefix
Uploaded by igrep at Tue Jul 17 08:29:35 UTC 2018
Distributions NixOS:0.1.0.1
Downloads 107 total (13 in the last 30 days)
Rating (no votes yet) [estimated by rule of succession]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2018-07-17 [all 1 reports]
Hackage Matrix CI

Modules

[Index]

Downloads

Maintainer's Corner

For package maintainers and hackage trustees


Readme for deriveJsonNoPrefix-0.1.0.1

[back to package description]

deriveJsonNoPrefix

Template Haskell macros to derive ToJSON/FromJSON instances in a more prefix-friendly manner.

Example

Suppose you want to create a JSON like this:

{
    "id": "ID STRING",
    "max": 0.789,
    "min": 0.123
}

You'd want to define a record type to derive the instance of ToJSON (and possibly FromJSON) automatically:

{-# LANGUAGE TemplateHaskell #-}

import Data.Aeson.TH

data SomeRecord = SomeRecord
  { id :: String
  , max :: Double
  , min :: Double
  } deriving (Eq, Show)

$(deriveToJSON ''SomeRecord)

But you shouldn't define such a record because both id, max, and min are predefined functions of Prelude!!

As a workaround, we frequently prefix the record labels with their type name:

data SomeRecord = SomeRecord
  { someRecordId :: String
  , someRecordMax :: Double
  , someRecordMin :: Double
  } deriving (Eq, Show)

Then deriveToJSON with a modified option:

deriveToJSON Json.defaultOptions { fieldLabelModifier = firstLower . drop (length "SomeRecord") } ''SomeRecord

That's almost exactly what deriveToJsonNoTypeNamePrefix does!!
deriveToJsonNoTypeNamePrefix is essentially defined as:

deriveToJsonNoTypeNamePrefix :: Name -> Q [Dec]
deriveToJsonNoTypeNamePrefix deriver name =
  deriveToJSON Json.defaultOptions { fieldLabelModifier = dropPrefix name } name

So now, you don't have reimplement the fieldLabelModifier anymore!

import Data.Aeson.DeriveNoPrefix

$(deriveJsonNoTypeNamePrefix ''SomeRecord)

Other libraries which would solve the same problem

  • extensible.
  • And other libraries providing extensible records with ToJSON / FromJSON instances.

So use this package all of them are too heavy in learning cost / dependency footprint / etc.