Parses a string supplied in the form of a JSON text, returning the results typically in the form of a map or array.
fn:parse-json
( $json-text
as xs:string?
item()?
fn:parse-json
( $json-text
as xs:string?
,$options
as map(*)
item()?
The effect of the one-argument form of this function is the same as calling the
two-argument form with an empty map as the value of the $options
argument.
The first argument is a JSON text as defined in , in the form of a string. The function parses this string to return an XDM value.
If the value of $json-text
is the empty sequence, the function returns the empty sequence.
The result will also be an empty sequence if $json-text
is the string "null"
.
The $options
argument can be used to control the way in which the parsing
takes place. The option parameter conventions apply.
The entries that may appear in the $options
map are as follows:
JSON-text
in . An error must be raised
if the input does not conform to the grammar.
The input may contain deviations from the grammar of ,
which are handled in an implementation-defined way. (Note: some popular
extensions include allowing quotes on keys to be omitted, allowing a comma
to appear after the last item in an array, allowing leading zeroes in numbers, and allowing control characters such as
tab and newline to be present in unescaped form.) Since the extensions accepted
are implementation-defined, an error may be raised
if the input does not conform to the grammar.
Determines the policy for handling duplicate keys in a JSON object.
To determine whether keys are duplicates, they are compared using the Unicode codepoint collation, after expanding escape
sequences, unless the
escape
option is set to true
, in which
case keys are compared in escaped form.
xs:string
use-first
An error is raised if duplicate keys are encountered.
If duplicate keys are present in a JSON object, all but the first of a set of duplicates are ignored.
If duplicate keys are present in a JSON object, all but the last of a set of duplicates are ignored.
Determines whether special characters are represented in the XDM output in backslash-escaped form.
xs:boolean
true
All characters in the input that are valid
in the version of XML supported by the implementation, whether or not they are represented
in the input by means of an escape sequence, are represented as unescaped characters in the result. Any
characters or codepoints that are not valid XML characters
(for example, unpaired surrogates) are passed to the fallback
function
as described below; in the absence of a fallback function, they are replaced by
the Unicode REPLACEMENT CHARACTER
(xFFFD
).
JSON escape sequences are used in the result to represent special characters in the JSON input, as defined below,
whether or not they were represented using JSON escape sequences in the input.
The characters that are considered "special" for this purpose are:
all codepoints in the range x00
to x1F
or x7F
to x9F
;
all codepoints that do not represent characters that are valid in the version of XML supported by the processor, including codepoints representing unpaired surrogates;
the backslash character itself (x5C
).
\t
), or a six-character escape sequence otherwise
(for example \uDEAD
). Characters other than these are not escaped in the result, even if they
were escaped in the input.
Provides a function which is called when the input contains an escape sequence
that represents a character that is not valid in the version of XML
supported by the implementation.
It is an error to supply the fallback
option if the escape
option is present
with the value true
.
function(xs:string) as xs:string
The default is effectively the function function($s){"�"}
: that is,
a function that replaces the escape sequence with the Unicode REPLACEMENT CHARACTER
.
The function is called when the JSON input contains a special character (as defined under
the escape
option) that is valid according to the JSON
grammar, whether the special character is represented in the input directly or as an escape sequence.
The function is called once for any surrogate
that is not properly paired with another surrogate. The string supplied as the argument will always be a two- or six- character escape
sequence, starting with a backslash, that conforms to the rules in the JSON grammar (as extended by the
implementation if liberal:true()
is specified): for example
\b
or \uFFFF
or \uDEAD
. The function is not
called for an escape sequence that is invalid against the grammar (for example \x0A
). The function returns a string
which is inserted into the result in place of the invalid character. The
function also has the option of raising a dynamic error by calling fn:error
.
The various structures that can occur in JSON are transformed recursively to XDM values as follows:
A JSON object is converted to a map.
The entries in the map correspond to the key/value
pairs in the JSON object. The key is always of type xs:string
; the
associated value may be of any type, and is the result of converting the JSON
value by recursive application of these rules. For example, the JSON text
{"x":2, "y":5}
is transformed to the value map{"x":2,
"y":5}
.
If duplicate keys are encountered in a JSON object, they are handled
as determined by the duplicates
option defined above.
A JSON array is transformed to an array whose members are the result of converting
the corresponding member of the array by recursive application of these rules. For
example, the JSON text ["a", "b", null]
is transformed to the value
["a", "b", ()]
.
A JSON string is converted to an xs:string
value.
The handling of special characters depends on the
escape
and fallback
options, as described in the table above.
A JSON number is converted to an xs:double
value using
the rules for casting from xs:string
to xs:double
.
The JSON boolean values true
and false
are
converted to the corresponding xs:boolean
values.
The JSON value null is converted to the empty sequence.
The expression parse-json('{"x":1, "y":[3,4,5]}')
returns map{"x":1e0,"y":[3e0,4e0,5e0]}
.
The expression parse-json('"abcd"')
returns "abcd"
.
The expression parse-json('{"x":"\\", "y":"\u0025"}')
returns map{"x":"\","y":"%"}
.
The expression parse-json('{"x":"\\", "y":"\u0025"}', map{'escape':true()})
returns map{"x":"\\","y":"%"}
.
The expression parse-json('{"x":"\\", "y":"\u0000"}')
returns map{"x":"\","y":codepoints-to-string(65533)}
.
The expression parse-json('{"x":"\\", "y":"\u0000"}', map{'escape':true()})
returns map{"x":"\\","y":"\u0000"}
.
The expression parse-json('{"x":"\\", "y":"\u0000"}', map{'fallback':function($s){'['||$s||']'}})
returns map{"x":"\","y":"[\u0000]"}
.
A dynamic error occurs if the value of
$input
does not conform to the JSON grammar, unless the option
"liberal":true()
is present and the processor chooses to accept the deviation.
A dynamic error occurs if the option
"duplicates":"reject"
is present and the value of
$input
contains a JSON object with duplicate keys.
A dynamic error occurs if the $options
map contains an entry whose key is defined in this specification and whose value is not valid for that key,
or if it contains an entry with the key fallback
when the option "escape":true()
is also present.
The result of the function will be an instance of one of the following types. An
instance of
test (or in XQuery, typeswitch
) can be used to
distinguish them:
map(xs:string, item()?)
for a JSON object
array(item()?)
for a JSON array
xs:string
for a JSON string
xs:double
for a JSON number
xs:boolean
for a JSON boolean
empty-sequence()
for a JSON null (or for empty input)
If the input starts with a byte order mark, this function ignores it. The byte order mark may have been added to the data stream in order to facilitate decoding of an octet stream to a character string, but since this function takes a character string as input, the byte order mark serves no useful purpose.
The possibility of the input containing characters that are not valid in XML (for example, unpaired surrogates)
arises only when such characters are expressed using JSON escape sequences. The is because the input to the function
is an instance of xs:string
, which by definition can only contain characters that are valid in XML.