Copyright | (c) 2019 Ian Duncan |
---|---|
License | BSD3 |
Safe Haskell | None |
Language | Haskell98 |
Parsing, rendering, and traversing of RFC 6901 JSON pointers
Synopsis
- data JsonPointer
- mkJsonPointer :: [PointerSegment] -> JsonPointer
- pointerSegments :: JsonPointer -> [PointerSegment]
- jsonPtr :: QuasiQuoter
- parsePointer :: Text -> Either String JsonPointer
- parseURIFragment :: URIRef a -> Either String JsonPointer
- renderPointer :: JsonPointer -> Text
- valueAt :: JsonPointer -> Value -> Maybe Value
- overValueAt :: JsonPointer -> Value -> (Value -> Value) -> Value
- pointerTraversal :: JsonPointer -> Traversal' Value Value
- segmentTraversal :: PointerSegment -> Traversal' Value Value
- data PointerSegment
- unsafeTextSegment :: Text -> PointerSegment
- unsafeTextOrNumberSegment :: Int -> PointerSegment
- segmentText :: PointerSegment -> Text
- segmentNumber :: PointerSegment -> Maybe Int
- pointerParser :: Parser JsonPointer
- pointerSegmentParser :: Parser PointerSegment
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"]})
data JsonPointer Source #
Instances
mkJsonPointer :: [PointerSegment] -> JsonPointer Source #
pointerSegments :: JsonPointer -> [PointerSegment] Source #
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
parseURIFragment :: URIRef a -> Either String JsonPointer Source #
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
overValueAt :: JsonPointer -> Value -> (Value -> Value) -> Value Source #
Traversing JSON Documents
Segments
data PointerSegment Source #
Instances
Eq PointerSegment Source # | |
Defined in Data.Aeson.Pointer (==) :: PointerSegment -> PointerSegment -> Bool # (/=) :: PointerSegment -> PointerSegment -> Bool # | |
Show PointerSegment Source # | |
Defined in Data.Aeson.Pointer showsPrec :: Int -> PointerSegment -> ShowS # show :: PointerSegment -> String # showList :: [PointerSegment] -> ShowS # | |
Lift PointerSegment Source # | |
Defined in Data.Aeson.Pointer lift :: PointerSegment -> Q Exp # |
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.