**WARNING**: This document is a work in progress, just like JSONSelect itself. View or contribute to the latest version [on github](http://github.com/lloyd/JSONSelect/blob/master/JSONSelect.md) # JSONSelect 1. [introduction](#introduction) 1. [levels](#levels) 1. [language overview](#overview) 1. [grouping](#grouping) 1. [selectors](#selectors) 1. [pseudo classes](#pseudo) 1. [expressions](#expressions) 1. [combinators](#combinators) 1. [grammar](#grammar) 1. [conformance tests](#tests) 1. [references](#references) ## Introduction JSONSelect defines a language very similar in syntax and structure to [CSS3 Selectors](http://www.w3.org/TR/css3-selectors/). JSONSelect expressions are patterns which can be matched against JSON documents. Potential applications of JSONSelect include: * Simplified programmatic matching of nodes within JSON documents. * Stream filtering, allowing efficient and incremental matching of documents. * As a query language for a document database. ## Levels The specification of JSONSelect is broken into three levels. Higher levels include more powerful constructs, and are likewise more complicated to implement and use. **JSONSelect Level 1** is a small subset of CSS3. Every feature is derived from a CSS construct that directly maps to JSON. A level 1 implementation is not particularly complicated while providing basic querying features. **JSONSelect Level 2** builds upon Level 1 adapting more complex CSS constructs which allow expressions to include constraints such as patterns that match against values, and those which consider a node's siblings. Level 2 is still a direct adaptation of CSS, but includes constructs whose semantic meaning is significantly changed. **JSONSelect Level 3** adds constructs which do not necessarily have a direct analog in CSS, and are added to increase the power and convenience of the selector language. These include aliases, wholly new pseudo class functions, and more blue sky dreaming. ## Language Overview
pattern | meaning | level |
---|---|---|
* | Any node | 1 |
T | A node of type T, where T is one string, number, object, array, boolean, or null | 1 |
T.key | A node of type T which is the child of an object and is the value its parents key property | 1 |
T."complex key" | Same as previous, but with property name specified as a JSON string | 1 |
T:root | A node of type T which is the root of the JSON document | 1 |
T:nth-child(n) | A node of type T which is the nth child of an array parent | 1 |
T:nth-last-child(n) | A node of type T which is the nth child of an array parent counting from the end | 2 |
T:first-child | A node of type T which is the first child of an array parent (equivalent to T:nth-child(1) | 1 |
T:last-child | A node of type T which is the last child of an array parent (equivalent to T:nth-last-child(1) | 2 |
T:only-child | A node of type T which is the only child of an array parent | 2 |
T:empty | A node of type T which is an array or object with no child | 2 |
T U | A node of type U with an ancestor of type T | 1 |
T > U | A node of type U with a parent of type T | 1 |
T ~ U | A node of type U with a sibling of type T | 2 |
S1, S2 | Any node which matches either selector S1 or S2 | 1 |
T:has(S) | A node of type T which has a child node satisfying the selector S | 3 |
T:expr(E) | A node of type T with a value that satisfies the expression E | 3 |
T:val(V) | A node of type T with a value that is equal to V | 3 |
T:contains(S) | A node of type T with a string value contains the substring S | 3 |