Difference between revisions of "JSON Module"
(38 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
− | This [[Module Library|XQuery Module]] contains functions to parse and serialize JSON | + | This [[Module Library|XQuery Module]] contains functions to parse and serialize JSON data [http://www.json.org/ JSON (JavaScript Object Notation)] is a popular data exchange format for applications written in JavaScript. As there are notable differences between JSON and XML, or XQuery data types, no mapping exists that guarantees a lossless, bidirectional conversion between JSON and XML. For this reason, we offer various mappings, all of which are suited to different use cases. |
=Conventions= | =Conventions= | ||
− | All functions in this module are assigned to the | + | All functions and errors in this module are assigned to the <code><nowiki>http://basex.org/modules/json</nowiki></code> namespace, which is statically bound to the {{Code|json}} prefix.<br/> |
− | |||
==Conversion Formats== | ==Conversion Formats== | ||
+ | |||
+ | '''A little advice''': in the Database Creation dialog of the GUI, if you select JSON Parsing and switch to the ''Parsing'' tab, you can see the effects of some of the conversion options. | ||
===Direct=== | ===Direct=== | ||
Line 15: | Line 16: | ||
* Object pairs are represented via elements. The name of a pair is rewritten to an element name: | * Object pairs are represented via elements. The name of a pair is rewritten to an element name: | ||
** Empty names are represented by a single underscore ({{Code|_}}). Existing underscores are rewritten to two underscores ({{Code|__}}), and characters that are not valid in element names are rewritten to an underscore and the character’s four-digit Unicode. | ** Empty names are represented by a single underscore ({{Code|_}}). Existing underscores are rewritten to two underscores ({{Code|__}}), and characters that are not valid in element names are rewritten to an underscore and the character’s four-digit Unicode. | ||
− | ** If the {{Code|lax}} option is set to {{Code| | + | ** If the {{Code|lax}} option is set to {{Code|true}}, invalid characters are simply replaced with underscores or (when invalid as first character of an element name) prefixed with an underscore. The resulting names are better readable, but cannot always be converted back to their original form. |
* Array entries are also represented via elements. {{Code|_}} is used as element name. | * Array entries are also represented via elements. {{Code|_}} is used as element name. | ||
* Object and array values are stored in text nodes. | * Object and array values are stored in text nodes. | ||
Line 34: | Line 35: | ||
** As most values are strings, the ''string'' type is by default omitted. | ** As most values are strings, the ''string'' type is by default omitted. | ||
− | === | + | ===Basic=== |
− | The {{Code| | + | The {{Code|basic}} format is another lossless format. It converts a JSON document to an XML node and vice versa. The conversion rules are the same as for [[XQuery 3.1#fn:json-to-xml|fn:json-to-xml]]. |
===JsonML=== | ===JsonML=== | ||
Line 42: | Line 43: | ||
The {{Code|jsonml}} format is designed to convert XML to JSON and back, using the JsonML dialect. JsonML allows the transformation of arbitrary XML documents, but namespaces, comments and processing instructions will be discarded in the transformation process. More details are found in the official [http://jsonml.org/XML JsonML documentation]. | The {{Code|jsonml}} format is designed to convert XML to JSON and back, using the JsonML dialect. JsonML allows the transformation of arbitrary XML documents, but namespaces, comments and processing instructions will be discarded in the transformation process. More details are found in the official [http://jsonml.org/XML JsonML documentation]. | ||
− | + | ===XQuery=== | |
+ | |||
+ | The {{Code|xquery}} format is lossless, too. It converts JSON data to an XQuery value (a map, array, string, number, boolean, or empty sequence) and vice versa. The conversion rules are the same as for [[XQuery 3.1#fn:parse-json|fn:parse-json]]. | ||
+ | |||
+ | The resulting representation consumes less memory than XML-based formats, and values can be directly accessed without conversion. Thus, it is recommendable for very large inputs and for efficient ad-hoc processing. | ||
==Options== | ==Options== | ||
Line 58: | Line 63: | ||
| {{Code|format}} | | {{Code|format}} | ||
| Specifies the format for converting JSON data. | | Specifies the format for converting JSON data. | ||
− | | {{Code|direct}}, {{Code|attributes}}, {{Code|jsonml}}, {{Code| | + | | {{Code|direct}}, {{Code|attributes}}, {{Code|jsonml}}, {{Code|xquery}} |
| {{Code|direct}} | | {{Code|direct}} | ||
| ''parse'', ''serialize'' | | ''parse'', ''serialize'' | ||
|- valign="top" | |- valign="top" | ||
| {{Code|liberal}} | | {{Code|liberal}} | ||
− | | | + | | Determines if minor deviations from [http://www.rfc-editor.org/rfc/rfc7159.txt RFC 7159] will be ignored. |
| {{Code|yes}}, {{Code|no}} | | {{Code|yes}}, {{Code|no}} | ||
| {{Code|no}} | | {{Code|no}} | ||
Line 70: | Line 75: | ||
| {{Code|merge}} | | {{Code|merge}} | ||
| This option is considered when {{Code|direct}} or {{Code|attributes}} conversion is used:<br/> | | This option is considered when {{Code|direct}} or {{Code|attributes}} conversion is used:<br/> | ||
− | * If a name has the same type throughout the | + | * If a name has the same type throughout the data, the {{Code|type}} attribute will be omitted. Instead, the name will be listed in additional, type-specific attributes in the root node. |
* The attributes are named by their type in plural (''numbers'', ''booleans'', ''nulls'', ''objects'' and ''arrays''), and the attribute value contains all names with that type, separated by whitespaces. | * The attributes are named by their type in plural (''numbers'', ''booleans'', ''nulls'', ''objects'' and ''arrays''), and the attribute value contains all names with that type, separated by whitespaces. | ||
| {{Code|yes}}, {{Code|no}} | | {{Code|yes}}, {{Code|no}} | ||
Line 88: | Line 93: | ||
| ''parse'', ''serialize'' | | ''parse'', ''serialize'' | ||
|- valign="top" | |- valign="top" | ||
− | | {{Code| | + | | {{Code|escape}} |
| Indicates if escaped characters are expanded (for example, {{Code|\n}} becomes a single {{Code|x0A}} character, while {{Code|\u20AC}} becomes the character {{Code|€}}). | | Indicates if escaped characters are expanded (for example, {{Code|\n}} becomes a single {{Code|x0A}} character, while {{Code|\u20AC}} becomes the character {{Code|€}}). | ||
| {{Code|yes}}, {{Code|no}} | | {{Code|yes}}, {{Code|no}} | ||
Line 105: | Line 110: | ||
| {{Code|yes}} | | {{Code|yes}} | ||
| ''serialize'' | | ''serialize'' | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
|} | |} | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
=Functions= | =Functions= | ||
Line 136: | Line 119: | ||
|- | |- | ||
| width='120' | '''Signatures''' | | width='120' | '''Signatures''' | ||
− | |{{Func|json:parse|$ | + | |{{Func|json:parse|$string as xs:string?|item()?}}<br/>{{Func|json:parse|$string as xs:string?, $options as map(*)?|item()?}} |
|- | |- | ||
| '''Summary''' | | '''Summary''' | ||
− | |Converts the JSON | + | |Converts the JSON {{Code|$string}} to an XQuery value. If the input can be successfully parsed, it can be serialized back to the original JSON representation. The {{Code|$options}} argument can be used to control the way the input is converted. |
|- | |- | ||
| '''Errors''' | | '''Errors''' | ||
− | |{{Error| | + | |{{Error|parse|#Errors}} the specified input cannot be parsed as JSON document.<br/>{{Error|options|#Errors}} the specified options are conflicting. |
|} | |} | ||
==json:serialize== | ==json:serialize== | ||
− | |||
− | |||
{| width='100%' | {| width='100%' | ||
|- | |- | ||
| width='120' | '''Signatures''' | | width='120' | '''Signatures''' | ||
− | |{{Func|json:serialize|$input as | + | |{{Func|json:serialize|$input as item()?|xs:string}}<br/>{{Func|json:serialize|$input as item()?, $options as map(*)?|xs:string}} |
|- | |- | ||
| '''Summary''' | | '''Summary''' | ||
− | |Serializes the | + | |Serializes the specified {{Code|$input}} as JSON, using the specified {{Code|$options}}, and returns the result as string: |
+ | * The input is expected to conform to the results that are created by [[#json:parse|json:parse()]]. | ||
+ | * Non-conforming items will be serialized as specified in the [[XQuery 3.1#JSON Serialization|json output method]] of the official recommendation. | ||
+ | Values can also be serialized as JSON with the standard [[Serialization]] feature of XQuery: | ||
+ | * The parameter {{Code|method}} needs to be set to {{Code|json}}, and | ||
+ | * the options presented in this article need to be assigned to the {{Code|json}} parameter. | ||
|- | |- | ||
| '''Errors''' | | '''Errors''' | ||
− | |{{Error| | + | |{{Error|serialize|#Errors}} the specified node cannot be serialized as JSON document. |
|} | |} | ||
Line 208: | Line 194: | ||
"link": "http://www.flickr.com/groups/talkontravel/pool/", | "link": "http://www.flickr.com/groups/talkontravel/pool/", | ||
"description": "Travel and vacation photos from around the world.", | "description": "Travel and vacation photos from around the world.", | ||
− | "modified": " | + | "modified": "2014-02-02T11:10:27Z", |
"generator": "http://www.flickr.com/" | "generator": "http://www.flickr.com/" | ||
}') | }') | ||
Line 219: | Line 205: | ||
<link>http://www.flickr.com/groups/talkontravel/pool/</link> | <link>http://www.flickr.com/groups/talkontravel/pool/</link> | ||
<description>Travel and vacation photos from around the world.</description> | <description>Travel and vacation photos from around the world.</description> | ||
− | <modified> | + | <modified>2014-02-02T11:10:27Z</modified> |
<generator>http://www.flickr.com/</generator> | <generator>http://www.flickr.com/</generator> | ||
</json> | </json> | ||
Line 277: | Line 263: | ||
==JsonML Format== | ==JsonML Format== | ||
− | '''Example 1: Converts all XML documents in a database to JsonML and writes them to disk''' | + | '''Example 1: Converts all XML documents in a database to the JsonML format and writes them to disk''' |
'''Query:''' | '''Query:''' | ||
Line 283: | Line 269: | ||
for $doc in collection('json') | for $doc in collection('json') | ||
let $name := document-uri($doc) | let $name := document-uri($doc) | ||
− | let $json := json:serialize($doc) | + | let $json := json:serialize($doc, map { 'format': 'jsonml' }) |
return file:write($name, $json) | return file:write($name, $json) | ||
</pre> | </pre> | ||
− | '''Example 2 | + | '''Example 2: Converts an XML document with elements and text''' |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
'''Query:''' | '''Query:''' | ||
Line 312: | Line 286: | ||
<link>http://www.flickr.com/groups/talkontravel/pool/</link> | <link>http://www.flickr.com/groups/talkontravel/pool/</link> | ||
<description>Travel and vacation photos from around the world.</description> | <description>Travel and vacation photos from around the world.</description> | ||
− | <modified> | + | <modified>2014-02-02T11:10:27Z</modified> |
<generator>http://www.flickr.com/</generator> | <generator>http://www.flickr.com/</generator> | ||
</flickr> | </flickr> | ||
Line 327: | Line 301: | ||
"Travel and vacation photos from around the world."], | "Travel and vacation photos from around the world."], | ||
["modified", | ["modified", | ||
− | " | + | "2014-02-02T11:10:27Z"], |
["generator", | ["generator", | ||
"http://www.flickr.com/"]] | "http://www.flickr.com/"]] | ||
</pre> | </pre> | ||
− | '''Example | + | '''Example 3: Converts a document with nested elements and attributes to JsonML''' |
'''Query:''' | '''Query:''' | ||
Line 370: | Line 344: | ||
["phone", {"type":"home"}, | ["phone", {"type":"home"}, | ||
"212 555-1234"]] | "212 555-1234"]] | ||
+ | </pre> | ||
+ | |||
+ | ==XQuery Format== | ||
+ | |||
+ | '''Example 1: Converts a JSON string to XQuery''' | ||
+ | |||
+ | '''Query:''' | ||
+ | <pre class="brush:xquery"> | ||
+ | let $input := '{ | ||
+ | "Title": "Drinks", | ||
+ | "Author": [ "Jim Daniels", "Jack Beam" ] | ||
+ | }' | ||
+ | let $data := json:parse($input, map { 'format': 'xquery' }) | ||
+ | return map:for-each($data, function($k, $v) { | ||
+ | $k || ': ' || string-join($v, ', ') | ||
+ | }) | ||
+ | </pre> | ||
+ | |||
+ | '''Result:''' | ||
+ | <pre> | ||
+ | Author: Jim Daniels, Jack Beam | ||
+ | Title: Drinks | ||
+ | </pre> | ||
+ | |||
+ | '''Example 2: Converts XQuery data to JSON''' | ||
+ | |||
+ | '''Query:''' | ||
+ | <pre class="brush:xquery"> | ||
+ | for $item in ( | ||
+ | true(), | ||
+ | 'ABC', | ||
+ | array { 1 to 5 }, | ||
+ | map { "Key": "Value" } | ||
+ | ) | ||
+ | return json:serialize( | ||
+ | $item, | ||
+ | map { 'format': 'xquery', 'indent': 'no' } | ||
+ | ) | ||
+ | </pre> | ||
+ | |||
+ | '''Result:''' | ||
+ | <pre> | ||
+ | true | ||
+ | "ABC" | ||
+ | [1,2,3,4,5] | ||
+ | {"Key":"Value"} | ||
</pre> | </pre> | ||
Line 378: | Line 398: | ||
|Description | |Description | ||
|- | |- | ||
− | |{{Code| | + | |{{Code|options}} |
+ | |The specified options are conflicting. | ||
+ | |- | ||
+ | |{{Code|parse}} | ||
|The specified input cannot be parsed as JSON document. | |The specified input cannot be parsed as JSON document. | ||
|- | |- | ||
− | |{{Code| | + | |{{Code|serialize}} |
|The specified node cannot be serialized as JSON document. | |The specified node cannot be serialized as JSON document. | ||
|} | |} | ||
=Changelog= | =Changelog= | ||
+ | |||
+ | ; Version 9.1 | ||
+ | * Updated: [[#json:parse|json:parse]] can be called with empty sequence. | ||
+ | |||
+ | ;Version 9.0 | ||
+ | * Updated: <code>map</code> format renamed to <code>xquery</code>. | ||
+ | * Updated: error codes updated; errors now use the module namespace | ||
+ | |||
+ | ;Version 8.4 | ||
+ | * Updated: <code>unescape</code> changed to <code>escape</code>. | ||
+ | |||
+ | ;Version 8.2 | ||
+ | * Added: Conversion format <code>[[#Basic|basic]]</code>. | ||
;Version 8.0 | ;Version 8.0 | ||
− | * Updated: Serialization aligned with the {{Code|json}} output method of the official specification | + | * Updated: Serialization aligned with the {{Code|json}} output method of the official specification. |
− | * Added: {{Code|liberal}} option | + | * Added: {{Code|liberal}} option. |
− | * Removed: {{Code|spec}} option | + | * Removed: {{Code|spec}} option. |
;Version 7.8 | ;Version 7.8 | ||
− | * Removed: {{Code|json:parse-ml}}, {{Code|json:serialize-ml}} | + | * Removed: {{Code|json:parse-ml}}, {{Code|json:serialize-ml}}. |
− | * Updated: {{Code|json:parse}} now returns a document node instead of an element, or an XQuery map if {{Code|format}} is set to {{Code|map}}. | + | * Updated: {{Code|json:parse}} now returns a document node instead of an element, or an XQuery map if {{Code|format}} is set to {{Code|.map}}. |
;Version 7.7.2 | ;Version 7.7.2 | ||
− | * Updated: {{Code|$options}} argument added to [[#json:parse|json:parse]] and [[#json:serialize|json:serialize]] | + | * Updated: {{Code|$options}} argument added to [[#json:parse|json:parse]] and [[#json:serialize|json:serialize]]. |
− | * Updated: [[#json:parse-ml|json:parse-ml]] and [[#json:serialize-ml|json:serialize-ml]] are now ''deprecated'' | + | * Updated: [[#json:parse-ml|json:parse-ml]] and [[#json:serialize-ml|json:serialize-ml]] are now ''deprecated''. |
The module was introduced with Version 7.0. | The module was introduced with Version 7.0. | ||
− | |||
− |
Revision as of 14:38, 16 April 2019
This XQuery Module contains functions to parse and serialize JSON data JSON (JavaScript Object Notation) is a popular data exchange format for applications written in JavaScript. As there are notable differences between JSON and XML, or XQuery data types, no mapping exists that guarantees a lossless, bidirectional conversion between JSON and XML. For this reason, we offer various mappings, all of which are suited to different use cases.
Contents
Conventions
All functions and errors in this module are assigned to the http://basex.org/modules/json
namespace, which is statically bound to the json
prefix.
Conversion Formats
A little advice: in the Database Creation dialog of the GUI, if you select JSON Parsing and switch to the Parsing tab, you can see the effects of some of the conversion options.
Direct
The direct
conversion format allows a lossless conversion from JSON to XML and back. The transformation is based on the following rules:
- The resulting document has a
<json>
root node. - Object pairs are represented via elements. The name of a pair is rewritten to an element name:
- Empty names are represented by a single underscore (
_
). Existing underscores are rewritten to two underscores (__
), and characters that are not valid in element names are rewritten to an underscore and the character’s four-digit Unicode. - If the
lax
option is set totrue
, invalid characters are simply replaced with underscores or (when invalid as first character of an element name) prefixed with an underscore. The resulting names are better readable, but cannot always be converted back to their original form.
- Empty names are represented by a single underscore (
- Array entries are also represented via elements.
_
is used as element name. - Object and array values are stored in text nodes.
- The types of values are represented via
type
attributes:- The existing types are string, number, boolean, null, object, and array.
- As most values are strings, the string type is by default omitted.
Attributes
The attributes
format is lossless, too. The transformation based on the following rules:
- The resulting document has a
<json>
root node. - Object pairs are represented via
<pair>
elements. The name of a pair is stored in aname
attribute. - Array entries are represented via
<item>
elements. - Object and array values are stored in text nodes.
- The types of values are represented via
type
attributes:- The existing types are string, number, boolean, null, object, and array.
- As most values are strings, the string type is by default omitted.
Basic
The basic
format is another lossless format. It converts a JSON document to an XML node and vice versa. The conversion rules are the same as for fn:json-to-xml.
JsonML
The jsonml
format is designed to convert XML to JSON and back, using the JsonML dialect. JsonML allows the transformation of arbitrary XML documents, but namespaces, comments and processing instructions will be discarded in the transformation process. More details are found in the official JsonML documentation.
XQuery
The xquery
format is lossless, too. It converts JSON data to an XQuery value (a map, array, string, number, boolean, or empty sequence) and vice versa. The conversion rules are the same as for fn:parse-json.
The resulting representation consumes less memory than XML-based formats, and values can be directly accessed without conversion. Thus, it is recommendable for very large inputs and for efficient ad-hoc processing.
Options
The following options are available (the Direction column indicates if an option applies to parsing, serialization, or both operations):
Option | Description | Allowed | Default | Direction |
---|---|---|---|---|
format
|
Specifies the format for converting JSON data. | direct , attributes , jsonml , xquery
|
direct
|
parse, serialize |
liberal
|
Determines if minor deviations from RFC 7159 will be ignored. | yes , no
|
no
|
parse |
merge
|
This option is considered when direct or attributes conversion is used:
|
yes , no
|
no
|
parse, serialize |
strings
|
Indicates if type attributes will be added for strings.
|
yes , no
|
yes
|
parse, serialize |
lax
|
Specifies if a lax approach is used to convert QNames to JSON names. | yes , no
|
no
|
parse, serialize |
escape
|
Indicates if escaped characters are expanded (for example, \n becomes a single x0A character, while \u20AC becomes the character € ).
|
yes , no
|
yes
|
parse |
escape
|
Indicates if characters are escaped whenever the JSON syntax requires it. This option can be set to no if strings are already in escaped form and no further escaping is permitted.
|
yes , no
|
yes
|
serialize |
indent
|
Indicates if whitespace should be added to the output with the aim of improving human legibility. If the parameter is set as in the query prolog, it overrides the indent serialization parameter.
|
yes , no
|
yes
|
serialize |
Functions
json:parse
Signatures | json:parse($string as xs:string?) as item()? json:parse($string as xs:string?, $options as map(*)?) as item()?
|
Summary | Converts the JSON $string to an XQuery value. If the input can be successfully parsed, it can be serialized back to the original JSON representation. The $options argument can be used to control the way the input is converted.
|
Errors | parse : the specified input cannot be parsed as JSON document.options : the specified options are conflicting.
|
json:serialize
Signatures | json:serialize($input as item()?) as xs:string json:serialize($input as item()?, $options as map(*)?) as xs:string
|
Summary | Serializes the specified $input as JSON, using the specified $options , and returns the result as string:
Values can also be serialized as JSON with the standard Serialization feature of XQuery:
|
Errors | serialize : the specified node cannot be serialized as JSON document.
|
Examples
BaseX Format
Example 1: Adds all JSON documents in a directory to a database
Query:
let $database := "database" for $name in file:list('.', false(), '*.json') let $file := file:read-text($name) let $json := json:parse($file) return db:add($database, $json, $name)
Example 2: Converts a simple JSON string to XML and back
Query:
json:parse('{}')
Result:
<json type="object"/>
Query:
(: serialize result as plain text :) declare option output:method 'text'; json:serialize(<json type="object"/>)
Result:
{ }
Example 3: Converts a JSON string with simple objects and arrays
Query:
json:parse('{ "title": "Talk On Travel Pool", "link": "http://www.flickr.com/groups/talkontravel/pool/", "description": "Travel and vacation photos from around the world.", "modified": "2014-02-02T11:10:27Z", "generator": "http://www.flickr.com/" }')
Result:
<json type="object"> <title>Talk On Travel Pool</title> <link>http://www.flickr.com/groups/talkontravel/pool/</link> <description>Travel and vacation photos from around the world.</description> <modified>2014-02-02T11:10:27Z</modified> <generator>http://www.flickr.com/</generator> </json>
Example 4: Converts a JSON string with different data types
Query:
let $options := map { 'merge': true() } return json:parse('{ "first_name": "John", "last_name": "Smith", "age": 25, "address": { "street": "21 2nd Street", "city": "New York", "code": 10021 }, "phone": [ { "type": "home", "number": "212 555-1234" }, { "type": "mobile", "number": 1327724623 } ] }', $options)
Result:
<json numbers="age code" arrays="phone" objects="json address value"> <first__name>John</first__name> <last__name>Smith</last__name> <age>25</age> <address> <street>21 2nd Street</street> <city>New York</city> <code>10021</code> </address> <phone> <_> <type>home</type> <number>212 555-1234</number> </_> <_> <type>mobile</type> <number type="number">1327724623</number> </_> </phone> </json>
JsonML Format
Example 1: Converts all XML documents in a database to the JsonML format and writes them to disk
Query:
for $doc in collection('json') let $name := document-uri($doc) let $json := json:serialize($doc, map { 'format': 'jsonml' }) return file:write($name, $json)
Example 2: Converts an XML document with elements and text
Query:
json:serialize(doc('flickr.xml'), map { 'format': 'jsonml' })
flickr.xml:
<flickr> <title>Talk On Travel Pool</title> <link>http://www.flickr.com/groups/talkontravel/pool/</link> <description>Travel and vacation photos from around the world.</description> <modified>2014-02-02T11:10:27Z</modified> <generator>http://www.flickr.com/</generator> </flickr>
Result:
["flickr", ["title", "Talk On Travel Pool"], ["link", "http://www.flickr.com/groups/talkontravel/pool/"], ["description", "Travel and vacation photos from around the world."], ["modified", "2014-02-02T11:10:27Z"], ["generator", "http://www.flickr.com/"]]
Example 3: Converts a document with nested elements and attributes to JsonML
Query:
json:serialize(doc('input.xml'), map { 'format': 'jsonml' })
input.xml:
<address id='1'> <!-- comments will be discarded --> <last_name>Smith</last_name> <age>25</age> <address xmlns='will be dropped as well'> <street>21 2nd Street</street> <city>New York</city> <code>10021</code> </address> <phone type='home'>212 555-1234</phone> </address>
Result:
["address", {"id":"1"}, ["last_name", "Smith"], ["age", "25"], ["address", ["street", "21 2nd Street"], ["city", "New York"], ["code", "10021"]], ["phone", {"type":"home"}, "212 555-1234"]]
XQuery Format
Example 1: Converts a JSON string to XQuery
Query:
let $input := '{ "Title": "Drinks", "Author": [ "Jim Daniels", "Jack Beam" ] }' let $data := json:parse($input, map { 'format': 'xquery' }) return map:for-each($data, function($k, $v) { $k || ': ' || string-join($v, ', ') })
Result:
Author: Jim Daniels, Jack Beam Title: Drinks
Example 2: Converts XQuery data to JSON
Query:
for $item in ( true(), 'ABC', array { 1 to 5 }, map { "Key": "Value" } ) return json:serialize( $item, map { 'format': 'xquery', 'indent': 'no' } )
Result:
true "ABC" [1,2,3,4,5] {"Key":"Value"}
Errors
Code | Description |
---|---|
options
|
The specified options are conflicting. |
parse
|
The specified input cannot be parsed as JSON document. |
serialize
|
The specified node cannot be serialized as JSON document. |
Changelog
- Version 9.1
- Updated: json:parse can be called with empty sequence.
- Version 9.0
- Updated:
map
format renamed toxquery
. - Updated: error codes updated; errors now use the module namespace
- Version 8.4
- Updated:
unescape
changed toescape
.
- Version 8.2
- Added: Conversion format
basic
.
- Version 8.0
- Updated: Serialization aligned with the
json
output method of the official specification. - Added:
liberal
option. - Removed:
spec
option.
- Version 7.8
- Removed:
json:parse-ml
,json:serialize-ml
. - Updated:
json:parse
now returns a document node instead of an element, or an XQuery map ifformat
is set to.map
.
- Version 7.7.2
- Updated:
$options
argument added to json:parse and json:serialize. - Updated: json:parse-ml and json:serialize-ml are now deprecated.
The module was introduced with Version 7.0.