Lens.Micro.Aeson

microlens-aeson-2.2.0: Law-abiding lenses for Aeson, using microlens.

Copyright | (c) Colin Woodbury 2015, (c) Edward Kmett 2013-2014, (c) Paul Wilson 2012
License | BSD3
Maintainer | Colin Woodbury <colingw@gmail.com>
Safe Haskell | Trustworthy
Language | Haskell98

Lens.Micro.Aeson

Contents

- Numbers
- Primitive
- Objects and Arrays
- Decoding

Description

Traversals for Data.Aeson, based on microlens for minimal dependencies.

For basic manipulation of Aeson values, full `Prism` functionality isn't necessary. Since all Prisms are inherently Traversals, we provide Traversals that mimic the behaviour of the Prisms found in the original Data.Aeson.Lens.

Synopsis

- class AsNumber t where
- _Integral :: (AsNumber t, Integral a) => Traversal' t a
- nonNull :: Traversal' Value Value
- data Primitive
  - = StringPrim !Text
  - | NumberPrim !Scientific
  - | BoolPrim !Bool
  - | NullPrim
- class AsNumber t => AsPrimitive t where
- class AsPrimitive t => AsValue t where
- key :: AsValue t => Text -> Traversal' t Value
- members :: AsValue t => Traversal' t Value
- nth :: AsValue t => Int -> Traversal' t Value
- values :: AsValue t => Traversal' t Value
- class AsJSON t where

# Numbers

class AsNumber t where #

Traverse into various number types.

Methods

_Number :: Traversal' t Scientific #

    >>> "[1, \"x\"]" ^? nth 0 . _Number
    Just 1.0

    >>> "[1, \"x\"]" ^? nth 1 . _Number
    Nothing

_Number :: AsPrimitive t => Traversal' t Scientific #

    >>> "[1, \"x\"]" ^? nth 0 . _Number
    Just 1.0

    >>> "[1, \"x\"]" ^? nth 1 . _Number
    Nothing

_Double :: Traversal' t Double #

Traversal into an `Double` over a `Value`, `Primitive` or `Scientific`

    >>> "[10.2]" ^? nth 0 . _Double
    Just 10.2

_Integer :: Traversal' t Integer #

Traversal into an `Integer` over a `Value`, `Primitive` or `Scientific`

    >>> "[10]" ^? nth 0 . _Integer
    Just 10

    >>> "[10.5]" ^? nth 0 . _Integer
    Just 10

    >>> "42" ^? _Integer
    Just 42

Instances

AsNumber ByteString # |
Methods _Number :: Traversal' ByteString Scientific # _Double :: Traversal' ByteString Double # _Integer :: Traversal' ByteString Integer #
AsNumber ByteString # |
Methods _Number :: Traversal' ByteString Scientific # _Double :: Traversal' ByteString Double # _Integer :: Traversal' ByteString Integer #
AsNumber Scientific # |
Methods _Number :: Traversal' Scientific Scientific # _Double :: Traversal' Scientific Double # _Integer :: Traversal' Scientific Integer #
AsNumber String # |
Methods _Number :: Traversal' String Scientific # _Double :: Traversal' String Double # _Integer :: Traversal' String Integer #
AsNumber Text # |
Methods _Number :: Traversal' Text Scientific # _Double :: Traversal' Text Double # _Integer :: Traversal' Text Integer #
AsNumber Value # |
Methods _Number :: Traversal' Value Scientific # _Double :: Traversal' Value Double # _Integer :: Traversal' Value Integer #
AsNumber Text # |
Methods _Number :: Traversal' Text Scientific # _Double :: Traversal' Text Double # _Integer :: Traversal' Text Integer #
AsNumber Primitive # |
Methods _Number :: Traversal' Primitive Scientific # _Double :: Traversal' Primitive Double # _Integer :: Traversal' Primitive Integer #

_Integral :: (AsNumber t, Integral a) => Traversal' t a #

Access Integer `Value`s as Integrals.

    >>> "[10]" ^? nth 0 . _Integral
    Just 10

    >>> "[10.5]" ^? nth 0 . _Integral
    Just 10

nonNull :: Traversal' Value Value #

Traversal into non-`Null` values

    >>> "{\"a\": \"xyz\", \"b\": null}" ^? key "a" . nonNull
    Just (String "xyz")

    >>> "{\"a\": {}, \"b\": null}" ^? key "a" . nonNull
    Just (Object (fromList []))

    >>> "{\"a\": \"xyz\", \"b\": null}" ^? key "b" . nonNull
    Nothing

# Primitive

data Primitive #

Primitives of `Value`

Constructors

StringPrim !Text |
NumberPrim !Scientific |
BoolPrim !Bool |
NullPrim |

Instances

Eq Primitive # |
Methods (==) :: Primitive -> Primitive -> Bool # (/=) :: Primitive -> Primitive -> Bool #
Data Primitive # |
Methods gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Primitive -> c Primitive # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c Primitive # toConstr :: Primitive -> Constr # dataTypeOf :: Primitive -> DataType # dataCast1 :: Typeable (* -> *) t => (forall d. Data d => c (t d)) -> Maybe (c Primitive) # dataCast2 :: Typeable (* -> * -> *) t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Primitive) # gmapT :: (forall b. Data b => b -> b) -> Primitive -> Primitive # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Primitive -> r # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Primitive -> r # gmapQ :: (forall d. Data d => d -> u) -> Primitive -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> Primitive -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> Primitive -> m Primitive # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Primitive -> m Primitive # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Primitive -> m Primitive #
Ord Primitive # |
Methods compare :: Primitive -> Primitive -> Ordering # (<) :: Primitive -> Primitive -> Bool # (<=) :: Primitive -> Primitive -> Bool # (>) :: Primitive -> Primitive -> Bool # (>=) :: Primitive -> Primitive -> Bool # max :: Primitive -> Primitive -> Primitive # min :: Primitive -> Primitive -> Primitive #
Show Primitive # |
Methods showsPrec :: Int -> Primitive -> ShowS # show :: Primitive -> String # showList :: [Primitive] -> ShowS #
AsPrimitive Primitive # |
Methods _Primitive :: Traversal' Primitive Primitive # _String :: Traversal' Primitive Text # _Bool :: Traversal' Primitive Bool # _Null :: Traversal' Primitive () #
AsNumber Primitive # |
Methods _Number :: Traversal' Primitive Scientific # _Double :: Traversal' Primitive Double # _Integer :: Traversal' Primitive Integer #

class AsNumber t => AsPrimitive t where #

Traverse into various JSON primatives.

Methods

_Primitive :: Traversal' t Primitive #

    >>> "[1, \"x\", null, true, false]" ^? nth 0 . _Primitive
    Just (NumberPrim 1.0)

    >>> "[1, \"x\", null, true, false]" ^? nth 1 . _Primitive
    Just (StringPrim "x")

    >>> "[1, \"x\", null, true, false]" ^? nth 2 . _Primitive
    Just NullPrim

    >>> "[1, \"x\", null, true, false]" ^? nth 3 . _Primitive
    Just (BoolPrim True)

    >>> "[1, \"x\", null, true, false]" ^? nth 4 . _Primitive
    Just (BoolPrim False)

_Primitive :: AsValue t => Traversal' t Primitive #

    >>> "[1, \"x\", null, true, false]" ^? nth 0 . _Primitive
    Just (NumberPrim 1.0)

    >>> "[1, \"x\", null, true, false]" ^? nth 1 . _Primitive
    Just (StringPrim "x")

    >>> "[1, \"x\", null, true, false]" ^? nth 2 . _Primitive
    Just NullPrim

    >>> "[1, \"x\", null, true, false]" ^? nth 3 . _Primitive
    Just (BoolPrim True)

    >>> "[1, \"x\", null, true, false]" ^? nth 4 . _Primitive
    Just (BoolPrim False)

_String :: Traversal' t Text #

    >>> "{\"a\": \"xyz\", \"b\": true}" ^? key "a" . _String
    Just "xyz"

    >>> "{\"a\": \"xyz\", \"b\": true}" ^? key "b" . _String
    Nothing

_Bool :: Traversal' t Bool #

    >>> "{\"a\": \"xyz\", \"b\": true}" ^? key "b" . _Bool
    Just True

    >>> "{\"a\": \"xyz\", \"b\": true}" ^? key "a" . _Bool
    Nothing

_Null :: Traversal' t () #

    >>> "{\"a\": \"xyz\", \"b\": null}" ^? key "b" . _Null
    Just ()

    >>> "{\"a\": \"xyz\", \"b\": null}" ^? key "a" . _Null
    Nothing

Instances

AsPrimitive ByteString # |
Methods _Primitive :: Traversal' ByteString Primitive # _String :: Traversal' ByteString Text # _Bool :: Traversal' ByteString Bool # _Null :: Traversal' ByteString () #
AsPrimitive ByteString # |
Methods _Primitive :: Traversal' ByteString Primitive # _String :: Traversal' ByteString Text # _Bool :: Traversal' ByteString Bool # _Null :: Traversal' ByteString () #
AsPrimitive String # |
Methods _Primitive :: Traversal' String Primitive # _String :: Traversal' String Text # _Bool :: Traversal' String Bool # _Null :: Traversal' String () #
AsPrimitive Text # |
Methods _Primitive :: Traversal' Text Primitive # _String :: Traversal' Text Text # _Bool :: Traversal' Text Bool # _Null :: Traversal' Text () #
AsPrimitive Value # |
Methods _Primitive :: Traversal' Value Primitive # _String :: Traversal' Value Text # _Bool :: Traversal' Value Bool # _Null :: Traversal' Value () #
AsPrimitive Text # |
Methods _Primitive :: Traversal' Text Primitive # _String :: Traversal' Text Text # _Bool :: Traversal' Text Bool # _Null :: Traversal' Text () #
AsPrimitive Primitive # |
Methods _Primitive :: Traversal' Primitive Primitive # _String :: Traversal' Primitive Text # _Bool :: Traversal' Primitive Bool # _Null :: Traversal' Primitive () #

# Objects and Arrays

class AsPrimitive t => AsValue t where #

Traverse into JSON Objects and Arrays.

Methods

_Value :: Traversal' t Value #

Traverse into data that encodes a `Value`

_Object :: Traversal' t (HashMap Text Value) #

    >>> "{\"a\": {}, \"b\": null}" ^? key "a" . _Object
    Just (fromList [])

    >>> "{\"a\": {}, \"b\": null}" ^? key "b" . _Object
    Nothing

_Array :: Traversal' t (Vector Value) #

Instances

AsValue ByteString # |
Methods _Value :: Traversal' ByteString Value # _Object :: Traversal' ByteString (HashMap Text Value) # _Array :: Traversal' ByteString (Vector Value) #
AsValue ByteString # |
Methods _Value :: Traversal' ByteString Value # _Object :: Traversal' ByteString (HashMap Text Value) # _Array :: Traversal' ByteString (Vector Value) #
AsValue String # |
Methods _Value :: Traversal' String Value # _Object :: Traversal' String (HashMap Text Value) # _Array :: Traversal' String (Vector Value) #
AsValue Text # |
Methods _Value :: Traversal' Text Value # _Object :: Traversal' Text (HashMap Text Value) # _Array :: Traversal' Text (Vector Value) #
AsValue Value # |
Methods _Value :: Traversal' Value Value # _Object :: Traversal' Value (HashMap Text Value) # _Array :: Traversal' Value (Vector Value) #
AsValue Text # |
Methods _Value :: Traversal' Text Value # _Object :: Traversal' Text (HashMap Text Value) # _Array :: Traversal' Text (Vector Value) #

key :: AsValue t => Text -> Traversal' t Value #

Like `ix`, but for `Object` with Text indices. This often has better inference than `ix` when used with OverloadedStrings.

    >>> "{\"a\": 100, \"b\": 200}" ^? key "a"
    Just (Number 100.0)

    >>> "[1,2,3]" ^? key "a"
    Nothing

members :: AsValue t => Traversal' t Value #

A Traversal into Object properties

    >>> "{\"a\": 4, \"b\": 7}" ^.. members
    [Number 4.0,Number 7.0]

    >>> "{\"a\": 4, \"b\": 7}" & members . _Number %~ (* 10)
    "{\"a\":40,\"b\":70}"

nth :: AsValue t => Int -> Traversal' t Value #

Like `ix`, but for Arrays with Int indexes

    >>> "[1,2,3]" ^? nth 1
    Just (Number 2.0)

    >>> "{\"a\": 100, \"b\": 200}" ^? nth 1
    Nothing

    >>> "[1,2,3]" & nth 1 .~ Number 20
    "[1,20,3]"

values :: AsValue t => Traversal' t Value #

A Traversal into Array elements

    >>> "[1,2,3]" ^.. values
    [Number 1.0,Number 2.0,Number 3.0]

    >>> "[1,2,3]" & values . _Number %~ (* 10)
    "[10,20,30]"

# Decoding

class AsJSON t where #

Traverse into actual encoded JSON.

Methods

_JSON :: (FromJSON a, ToJSON a) => Traversal' t a #

`_JSON` is a `Traversal` from something containing JSON to something encoded in that structure.

Instances

AsJSON ByteString # |
Methods _JSON :: (FromJSON a, ToJSON a) => Traversal' ByteString a #
AsJSON ByteString # |
Methods _JSON :: (FromJSON a, ToJSON a) => Traversal' ByteString a #
AsJSON String # |
Methods _JSON :: (FromJSON a, ToJSON a) => Traversal' String a #
AsJSON Text # |
Methods _JSON :: (FromJSON a, ToJSON a) => Traversal' Text a #
AsJSON Value # |
Methods _JSON :: (FromJSON a, ToJSON a) => Traversal' Value a #
AsJSON Text # |
Methods _JSON :: (FromJSON a, ToJSON a) => Traversal' Text a #