json-pointy-0.1.0.1: JSON Pointer (RFC 6901) parsing, access, and modification

Copyright(c) 2019 Ian Duncan
LicenseBSD3
Safe HaskellNone
LanguageHaskell98

Data.Aeson.Pointer

Contents

Description

Parsing, rendering, and traversing of RFC 6901 JSON pointers

Synopsis

Documentation

>>> import URI.ByteString.QQ
>>> :set -XOverloadedStrings
>>> :set -XQuasiQuotes
>>> :{
let sampleDoc = object
      [ "foo" .= ["bar" :: T.Text, "baz"]
      , "" .= (0 :: Int)
      , "a/b" .= (1 :: Int)
      , "c%d" .= (2 :: Int)
      , "e^f" .= (3 :: Int)
      , "g|h" .= (4 :: Int)
      , "i\\j" .= (5 :: Int)
      , "k\"l" .= (6 :: Int)
      , " " .= (7 :: Int)
      , "m~n" .= (8 :: Int)
      ]
:}
>>> let samplePointerText = "/data/foo" :: T.Text
>>> :{
let extractPointerValue = case parsePointer samplePointerText of
      Left err -> Nothing
      Right ptr ->
        (object ["data" .= object ["foo" .= 5.2]]) ^? pointerTraversal ptr
in extractPointerValue
:}
Just (Number 5.2)
>>> sampleDoc ^? pointerTraversal [jsonPtr||]
Just (Object (fromList [("c%d",Number 2.0),("m~n",Number 8.0),("e^f",Number 3.0),("",Number 0.0),(" ",Number 7.0),("foo",Array [String "bar",String "baz"]),("a/b",Number 1.0),("i\\j",Number 5.0),("k\"l",Number 6.0),("g|h",Number 4.0)]))
>>> sampleDoc ^? pointerTraversal [jsonPtr|/foo|]
Just (Array [String "bar",String "baz"])
>>> sampleDoc ^? pointerTraversal [jsonPtr|/foo/0|]
Just (String "bar")
>>> sampleDoc ^? pointerTraversal [jsonPtr|/foo/4|]
Nothing
>>> sampleDoc ^? pointerTraversal [jsonPtr|/|]
Just (Number 0.0)
>>> sampleDoc ^? pointerTraversal [jsonPtr|/a~1b|]
Just (Number 1.0)
>>> sampleDoc ^? pointerTraversal [jsonPtr|/c%d|]
Just (Number 2.0)
>>> sampleDoc ^? pointerTraversal [jsonPtr|/e^f|]
Just (Number 3.0)
>>> sampleDoc ^? pointerTraversal [jsonPtr|/g|h|]
Just (Number 4.0)
>>> sampleDoc ^? pointerTraversal [jsonPtr|/i\j|]
Just (Number 5.0)
>>> sampleDoc ^? pointerTraversal [jsonPtr|/k"l|]
Just (Number 6.0)
>>> sampleDoc ^? pointerTraversal [jsonPtr|/ |]
Just (Number 7.0)
>>> sampleDoc ^? pointerTraversal [jsonPtr|/m~0n|]
Just (Number 8.0)
>>> sampleDoc ^? pointerTraversal [jsonPtr|/woo|]
Nothing
>>> sampleDoc ^? pointerTraversal [jsonPtr|/m~0n/woo|]
Nothing
>>> parseURIFragment [relativeRef|#/c%25d|]
Right (JsonPointer {pointerSegments = [TextSegment "c%d"]})

jsonPtr :: QuasiQuoter Source #

Parse a JSON Pointer at compile time and embed as an expression.

>>> [jsonPtr|/foo/0|]
JsonPointer {pointerSegments = [TextSegment "foo",TextOrNumberSegment "0" 0]}

parsePointer :: Text -> Either String JsonPointer Source #

Parse a pointer from Text into a JsonPointer

renderPointer :: JsonPointer -> Text Source #

Render a JsonPointer back into its RFC 6901 machine-readable format:

>>> renderPointer [jsonPtr|/~1/~0/woo|]
"/~1/~0/woo"

Simple pointer access

Traversing JSON Documents

Segments

unsafeTextSegment :: Text -> PointerSegment Source #

Construct a PointerSegment from a Text value. The value must not be an Integer.

unsafeTextOrNumberSegment :: Int -> PointerSegment Source #

Construct a PointerSegment from an Int value. The value must be greater than or equal to zero.

segmentText :: PointerSegment -> Text Source #

Retrieve the text value of a pointer segment.

segmentNumber :: PointerSegment -> Maybe Int Source #

Retrieve the numeric value of a pointer segment, if the segment can be interpreted as a number.

Parsers