blob: 7d0aa268b0dafbf75c5e3b67f936328805f5f10c [file] [log] [blame]
= JSON Support
Cassandra 2.2 introduces JSON support to `SELECT <select-statement>` and
`INSERT <insert-statement>` statements.
This support does not fundamentally alter the CQL API (for example, the schema is still
enforced).
It simply provides a convenient way to work with JSON documents.
== SELECT JSON
With `SELECT` statements, the `JSON` keyword is used to return each row as a single `JSON` encoded map.
The remainder of the `SELECT` statement behavior is the same.
The result map keys match the column names in a normal result set.
For example, a statement like `SELECT JSON a, ttl(b) FROM ...` would result in a map with keys `"a"` and `"ttl(b)"`.
However, there is one notable exception: for symmetry with `INSERT JSON` behavior, case-sensitive column names with upper-case letters will be surrounded with double quotes.
For example, `SELECT JSON myColumn FROM ...` would result in a map key `"\"myColumn\""` with escaped quotes).
The map values will JSON-encoded representations (as described below) of the result set values.
== INSERT JSON
With `INSERT` statements, the new `JSON` keyword can be used to enable
inserting a `JSON` encoded map as a single row. The format of the `JSON`
map should generally match that returned by a `SELECT JSON` statement on
the same table. In particular, case-sensitive column names should be
surrounded with double quotes. For example, to insert into a table with
two columns named "myKey" and "value", you would do the following:
[source,cql]
----
include::example$CQL/insert_json.cql[]
----
By default (or if `DEFAULT NULL` is explicitly used), a column omitted
from the `JSON` map will be set to `NULL`, meaning that any pre-existing
value for that column will be removed (resulting in a tombstone being
created). Alternatively, if the `DEFAULT UNSET` directive is used after
the value, omitted column values will be left unset, meaning that
pre-existing values for those column will be preserved.
== JSON Encoding of Cassandra Data Types
Where possible, Cassandra will represent and accept data types in their
native `JSON` representation. Cassandra will also accept string
representations matching the CQL literal format for all single-field
types. For example, floats, ints, UUIDs, and dates can be represented by
CQL literal strings. However, compound types, such as collections,
tuples, and user-defined types must be represented by native `JSON`
collections (maps and lists) or a JSON-encoded string representation of
the collection.
The following table describes the encodings that Cassandra will accept
in `INSERT JSON` values (and `fromJson()` arguments) as well as the
format Cassandra will use when returning data for `SELECT JSON`
statements (and `fromJson()`):
[cols=",,,",options="header",]
|===
|Type |Formats accepted |Return format |Notes
| `ascii` | string | string | Uses JSON's `\u` character escape
| `bigint` | integer, string | integer | String must be valid 64 bit integer
| `blob` | string | string | String should be 0x followed by an even number of hex digits
| `boolean` | boolean, string | boolean | String must be "true" or "false"
| `date` | string | string | Date in format `YYYY-MM-DD`, timezone UTC
| `decimal` | integer, float, string | float | May exceed 32 or 64-bit IEEE-754 floating point precision in client-side decoder
| `double` | integer, float, string | float | String must be valid integer or float
| `float` | integer, float, string | float | String must be valid integer or float
| `inet` | string | string | IPv4 or IPv6 address
| `int` | integer, string | integer | String must be valid 32 bit integer
| `list` | list, string | list | Uses JSON's native list representation
| `map` | map, string | map | Uses JSON's native map representation
| `smallint` | integer, string | integer | String must be valid 16 bit integer
| `set` | list, string | list | Uses JSON's native list representation
| `text` | string | string | Uses JSON's `\u` character escape
| `time` | string | string | Time of day in format `HH-MM-SS[.fffffffff]`
| `timestamp` | integer, string | string | A timestamp. Strings constant allows to input `timestamps
as dates <timestamps>`. Datestamps with format `YYYY-MM-DD HH:MM:SS.SSS`
are returned.
| `timeuuid` | string | string | Type 1 UUID. See `constant` for the UUID format
| `tinyint` | integer, string | integer | String must be valid 8 bit integer
| `tuple` | list, string | list | Uses JSON's native list representation
| `UDT` | map, string | map | Uses JSON's native map representation with field names as keys
| `uuid` | string | string | See `constant` for the UUID format
| `varchar` | string | string | Uses JSON's `\u` character escape
| `varint` | integer, string | integer | Variable length; may overflow 32 or 64 bit integers in client-side decoder
|===
== The fromJson() Function
The `fromJson()` function may be used similarly to `INSERT JSON`, but
for a single column value. It may only be used in the `VALUES` clause of
an `INSERT` statement or as one of the column values in an `UPDATE`,
`DELETE`, or `SELECT` statement. For example, it cannot be used in the
selection clause of a `SELECT` statement.
== The toJson() Function
The `toJson()` function may be used similarly to `SELECT JSON`, but for
a single column value. It may only be used in the selection clause of a
`SELECT` statement.