LuaJSON(3)
==========
:Author: Thomas Harning
:Email:  harningt@gmail.com
:Date:   2009/04/29

NAME
----
luajson - JSON encoder/decoder for Lua

SYNOPSIS
--------
require("json")

json.decode("json-string" [, parameters])

json.decode.getDecoder(parameters)

json.encode(lua_value [, parameters])

json.encode.getEncoder(parameters)

DESCRIPTION
-----------
json.decode("json-string" [, parameters])::
    Obtains a JSON decoder using `getDecoder` with the parameters specified,
    then performs the decoding operation.

json.encode(lua_value [, parameters])::
    Obtains a JSON encoder using `getEncoder` with the parameters specified,
    then performs the encoding operation.

json.decode.getDecoder(parameters)::
    Obtains a JSON decoder configured with the given parameters or defaults.

json.encode.getEncoder(parameters)::
    Obtains a JSON encoder configured with the given parameters or defaults.

json.encode.strict::
    A default parameter specification containing 'strict' rules for encoding

json.decode.strict::
    A default parameter specification containing 'strict' rules for decoding

=== COMMON PARAMETERS

initialObject : boolean::
    Specifies if the outermost element be an array or object

allowUndefined : boolean::
    Specifies if 'undefined' is an allowed value

null : any::
    Placeholder object for null values

undefined : any::
    Placeholder for undefined values

number.nan : boolean::
    Specifies if NaN is an allowed value

number.inf : boolean::
    Specifies if +/-Infinity is an allowed value

=== ENCODER-SPECIFIC PARAMETERS

preProcess : `function(object)`::
    Called for every value to be encoded, optionally altering.
    If returns `nil` then no value change occurs.

output : function::
    Function that returns an encoder specification (TBD), if null
    default used that returns a string.

array.isArray : `function(object)`::
    If `true`/`false` returned, then the value is authoritatively
    an array or not

strings.xEncode : boolean::
    Specifies if binary values are to be encoded with \xNN rather than \uNNNN

strings.encodeSet : string::
    http://www.lua.org/manual/5.1/manual.html#5.4.1[gmatch-style] set of
    characters that need to be escaped (to be contained in `[]`)

strings.encodeSetAppend : string::
    Set of characters that need to be escaped (to be contained in `[]`).
    Appended to the current encodeSet.

==== Default Configuration
[source,lua]
----
array.isArray == json-util's isArray implementation
allowUndefined = true
number.nan = true
number.inf = true
strings.xEncode = false
strings.encodeSet = '\\"/%z\1-\031'
----

==== Strict Configuration
[source,lua]
----
initialObject = true
allowUndefined = false
number.nan = false
number.inf = false
----

=== DECODER-SPECIFIC PARAMETERS

unicodeWhitespace : boolean::
    Specifies if unicode whitespace characters are counted

array.trailingComma / object.trailingComma : boolean::
    Specifies if extraneous trailing commas are ignored in declaration

calls.defs : map<string | LPEG, function | boolean>::
    Defines set of specifically permitted function definitions.
    If boolean value, determines if allowed or not, decoded as a call object.
    Function return-value is the decoded result.
    Function definition:  `function(name, [arguments])` : output-value

calls.allowUndefined : boolean::
    Specifies if undefined call definitions are decoded as call objects.

number.frac : boolean::
    Specifies if numbers can have a decimal component (ex: `.01`)

number.exp : boolean::
    Specifies if exponents are allowed (ex: `1e2`)

number.hex : boolean::
    Specifies if hexadecimal numbers are allowed (ex: `0xDEADBEEF`)

object.number : boolean::
    Specifies if numbers can be object keys

object.identifier : boolean::
    Specifies if unquoted 'identifiers' can be object keys (matching `[A-Za-z_][A-Za-z0-9_]*`)

strings.badChars : string::
    Set of characters that should not be present in a string

strings.additionalEscapes : LPeg expression::
    LPeg expression to handle output (ex: `lpeg.C(1)` would take `\k` and spit out `k`)

strings.escapeCheck : non-consuming LPeg expression::
    LPeg expression to check if a given character is allowed to be an escape value

strings.decodeUnicode::
    `function (XX, YY)` handling \uXXYY situation to output decoded unicode sequence

strings.strict_quotes : boolean::
    Specifies if the `'` character is considered a quoting specifier

==== Default configuration

[source,lua]
----
unicodeWhitespace = true
initialObject = false
allowUndefined = true
array.trailingComma = true
number.frac = true
number.exp = true
number.hex = false
object.number = true
object.identifier = true
object.trailingComma = true
strings.badChars = '' -- No characters considered bad in a string
strings.additionalEscapes = false, -- disallow untranslated escapes
strings.escapeCheck = #lpeg.S('bfnrtv/\\"xu\'z'),
strings.decodeUnicode = utf8DecodeUnicode,
strings.strict_quotes = false
----

==== Strict configuration

[source,lua]
----
initialObject = true
allowUndefined = false
array.trailingComma = false
object.identifier = false
object.trailingComma = false
strings.badChars = '\b\f\n\r\t\v'
strings.additionalEscapes = false -- no additional escapes
strings.escapeCheck = #lpeg.S('bfnrtv/\\"u') --only these are allowed to be escaped
strings.strict_quotes = true
----

AUTHOR
------
Written by Thomas Harning Jr., <harningt@gmail.com>

REFERENCES
----------
http://www.inf.puc-rio.br/~roberto/lpeg[LPeg]

http://json.org[JSON]

COPYING
-------
Copyright (C) 2008-2009 Thomas Harning Jr.  Free use of this software is granted
under the terms of the MIT license.
