/** @mainpage Qore JSON Module @tableofcontents @section jsonintro Introduction The json module allows for easy serialization and deserialization between JSON strings and %Qore data structures. The module also provides functions for @ref JSONRPC support as well as a @ref Qore::Json::JsonRpcClient "JsonRpcClient" class for easier integration with JavaScript clients. This module is released under a choice of two licenses: - LGPL 2.1 - MIT (see COPYING.MIT in the source distribution for more information) . The module is tagged as such in the module's header (meaning it can be loaded unconditionally regardless of how the %Qore library was initialized). To use the module in a %Qore script, use the \c %%requires directive as follows: @code %requires json @endcode Also included with the binary json module: - JsonRpcHandler user module @note JSON functionality was included in the main %Qore shared library until version 0.8.1, at which time the code was removed to make this module. @section jsonserialization Automatic JSON Serialization and Deserialization JSON Serialization |!%Qore Type|!JSON-RPC Type|!Description |\c string|\c string|direct conversion to UTF-8 string |\c int|\c number|direct conversion |\c float|\c number|direct conversion |\c bool|\c boolean|direct conversion |\c date|\c string|date/time values are serialized to strings like: \c "2010-12-22 16:35:36.372996 Wed +01:00 (CET)" |\c binary|\c string|binary values are serialized as base64 encoded strings |\c list|\c array|direct conversion |\c hash|\c struct|direct conversion |\c NOTHING or \c NULL|\c null|direct conversion |all others|n/a|All other types will cause an \c JSON-RPC-SERIALIZATION-ERROR to be raised. JSON Deserialization |!JSON-RPC Type|!%Qore Type|!Description |\c string|\c string|direct conversion |\c number|\c int or \c float|if the JSON number is an integer, it is converted as an \c int, otherwise as a \c float |\c boolean|\c bool|direct conversion |\c array|\c list|direct conversion |\c struct|\c hash|direct conversion |\c null|\c NOTHING|direct conversion This following functions provide automatic JSON serialization and deserialization: Functions For JSON Serialization and Deserialization |!Function Name|!Description |@ref make_json()|Serializes qore data into a JSON string with optional verbose whitespace formatting for easier human readability |@ref parse_json()|Parses a JSON string and returns the corresponding %Qore data structure Deprecated JSON-RPC |!Deprecated Function Name|!New Function Name |@ref makeFormattedJSONString()|@ref make_json() |@ref makeJSONString()|@ref make_json() |@ref parseJSON()|@ref parse_json() @section JSONRPC JSON-RPC JSON-RPC is a lightweight but powerful JSON over HTTP web service protocol. The json module includes builtin support for this protocol as described here. Information about %Qore's JSON-RPC serialization can be found below. Classes Providing JSON-RPC Functionality |!Class|!Description |@ref Qore::Json::JsonRpcClient "JsonRpcClient"|For communicating with JSON-RPC servers Functions Providing JSON-RPC Functionality |!Function Name|!Description |@ref make_jsonrpc11_error()|Creates a JSON-RPC 1.1 error response string from the parameters passed with optional verbose whitespace formatting for easier human readability |@ref make_jsonrpc_error()|a generic JSON-RPC error response string from the parameters passed with optional verbose whitespace formatting for easier human readability |@ref make_jsonrpc_request()|Creates a JSON-RPC request string from the parameters passed with optional verbose whitespace formatting for easier human readability |@ref make_jsonrpc_response()|Creates a JSON-RPC response string from the parameters passed with optional verbose whitespace formatting for easier human readability Deprecated JSON-RPC Functions |!Deprecated Function Name|!New Function Name |@ref makeFormattedJSONRPC11ErrorString()|@ref make_jsonrpc11_error() |@ref makeFormattedJSONRPCErrorString()|@ref make_jsonrpc_error() |@ref makeFormattedJSONRPCRequestString()|@ref make_jsonrpc_request() |@ref makeFormattedJSONRPCResponseString()|@ref make_jsonrpc_response() |@ref makeJSONRPC11ErrorString()|@ref make_jsonrpc11_error() |@ref makeJSONRPCErrorString()|@ref make_jsonrpc_error() |@ref makeJSONRPCRequestString()|@ref make_jsonrpc_request() |@ref makeJSONRPCResponseString()|@ref make_jsonrpc_response() @section codetags Function and Method Tags @subsection NOOP NOOP Code with this flag makes no calculations, but rather returns a constant value. This flag is given to function and method variants that return a default value depending on the type of argument(s). When variants with this flag are resolved at parse time, a \c "call-with-type-errors" warning is raised (assuming this warning is enabled), unless \c PO_REQUIRE_TYPES or \c PO_STRICT_ARGS is set. If \c PO_REQUIRE_TYPES or \c PO_STRICT_ARGS is set, then these variants are inaccessible at parse time; resolving to a variant with this flag set at parse time causes an exception to be thrown. These variants are included for backwards-compatibility with qore prior to version 0.8.0 for functions that would ignore type errors in arguments. This tag is equal to @ref RUNTIME_NOOP, except no runtime effect is caused by resolving a function or method tagged with \c NOOP at runtime; this tag only affects parse time resolution. @subsection RUNTIME_NOOP RUNTIME_NOOP Code with this flag makes no calculations, but rather returns a constant value. This flag is given to function and method variants that return a default value depending on the type of argument(s). When variants with this flag are resolved at parse time, a \c "call-with-type-errors" warning is raised (assuming this warning is enabled), unless \c PO_REQUIRE_TYPES or \c PO_STRICT_ARGS is set. If \c PO_REQUIRE_TYPES or \c PO_STRICT_ARGS is set, then these variants are inaccessible; resolving to a variant with this flag set at parse time or run time causes an exception to be thrown. These variants are included for backwards-compatibility with qore prior to version 0.8.0 for functions that would ignore type errors in arguments. This tag is equal to @ref NOOP, except that \c RUNTIME_NOOP is also enforced at runtime. @subsection RET_VALUE_ONLY RET_VALUE_ONLY This flag indicates that the function or method has no side effects; it only returns a value, for example. This tag is identical to @ref CONSTANT except that functions or methods tagged with \c RET_VALUE_ONLY could throw exceptions. @subsection CONSTANT CONSTANT This flag indicates that the function or method has no side effects and does not throw any exceptions. This tag is identical to @ref RET_VALUE_ONLY except that functions or methods tagged with \c CONSTANT do not throw exceptions. @subsection DEPRECATED DEPRECATED Code with this flag is deprecated and may be removed in a future version of this module; if a variant with this flag is resolved at parse time, a \c "deprecated" warning is raised (assuming this warning is enabled). @section jsonreleasenotes Release Notes @subsection v0_1_6 Version 1.6 - @ref parse_json() now ignores UTF-8 and Unicode BOMs at the start of passed JSON string (issue 1398) - fixed a bug in request logging in the JsonRpcHandler module (issue 1487) - fixed a bug serializing hash keys with embedded quotes (issue 2242) @subsection v0_1_5 Version 1.5 - serialize binary values as base64-encoded strings - user modules moved to top-level qore module directory from version-specific module directory since they are valid for multiple versions of qore - serialize nan, +/-inf as \c null according to the JSON spec - added detection for invalid JSON-RPC calls and added a more user-friendly error message in the JsonRpcHandler module - new functions added conforming to %Qore's function naming convention, old camel-case functions deprecated - JSON tests ported to QUnit - %Qore 0.8.12 required as a minimum to build - JSON output is more compact; fewer extransous whitespaces are used @subsection v0_1_4 Version 1.4 - date/time values are always serialized with microseconds and in the local time zone for consistency's sake - fixed a crashing bug in the JSON control-character encoding algorithm - updated the JsonRpcHandler module for enhanced logging - source released under the MIT license as well as LGPL 2.1 @subsection v0_1_3 Version 1.3 - always include \c charset=utf-8 in the \c Content-Type in @ref Qore::Json::JsonRpcClient "JsonRpcClient"; JSON messages are always serialized with UTF-8 encoding @subsection v0_1_2 Version 1.2 - fixed serialization/deserialization/escaping regarding control characters @subsection v0_1_1 Version 1.1 - added support for the new arbitrary-precision numeric type introduced in qore 0.8.6 - serialize control characters with escape codes to be compatible with common Javascript JSON libraries (also corresponding deserialization support) @subsection v0_1_0 Version 1.0 - Initial release of the json module - Requires qore 0.8.1+ to build and run */