The JSON Reader is used by a Proxy to read a server response that is sent back in JSON format. This usually happens as a result of loading a Store - for example we might create something like this:
Ext.regModel('User', {
fields: ['id', 'name', 'email']
});
var store = new Ext.data.Store({
model: 'User',
proxy: {
type: 'ajax',
url : 'users.json',
reader: {
type: 'json'
}
}
});
The example above creates a 'User' model. Models are explained in the Model docs if you're not already familiar with them.
We created the simplest type of JSON Reader possible by simply telling our Store's Proxy that we want a JSON Reader. The Store automatically passes the configured model to the Store, so it is as if we passed this instead:
reader: {
type : 'json',
model: 'User'
}
The reader we set up is ready to read data from our server - at the moment it will accept a response like this:
[
{
"id": 1,
"name": "Ed Spencer",
"email": "[email protected]"
},
{
"id": 2,
"name": "Abe Elias",
"email": "[email protected]"
}
]
Reading other JSON formats
If you already have your JSON format defined and it doesn't look quite like what we have above, you can usually pass JsonReader a couple of configuration options to make it parse your format. For example, we can use the root configuration to parse data that comes back like this:
{
"users": [
{
"id": 1,
"name": "Ed Spencer",
"email": "[email protected]"
},
{
"id": 2,
"name": "Abe Elias",
"email": "[email protected]"
}
]
}
To parse this we just pass in a root configuration that matches the 'users' above:
reader: {
type: 'json',
root: 'users'
}
Sometimes the JSON structure is even more complicated. Document databases like CouchDB often provide metadata around each record inside a nested structure like this:
{
"total": 122,
"offset": 0,
"users": [
{
"id": "ed-spencer-1",
"value": 1,
"user": {
"id": 1,
"name": "Ed Spencer",
"email": "[email protected]"
}
}
]
}
In the case above the record data is nested an additional level inside the "users" array as each "user" item has additional metadata surrounding it ('id' and 'value' in this case). To parse data out of each "user" item in the JSON above we need to specify the record configuration like this:
reader: {
type : 'json',
root : 'users',
record: 'user'
}
Response metadata
The server can return additional data in its response, such as the total number of records and the success status of the response. These are typically included in the JSON response like this:
{
"total": 100,
"success": true,
"users": [
{
"id": 1,
"name": "Ed Spencer",
"email": "[email protected]"
}
]
}
If these properties are present in the JSON response they can be parsed out by the JsonReader and used by the Store that loaded it. We can set up the names of these properties by specifying a final pair of configuration options:
reader: {
type : 'json',
root : 'users',
totalProperty : 'total',
successProperty: 'success'
}
These final options are not necessary to make the Reader work, but can be useful when the server needs to report an error or if it needs to indicate that there is a lot of data available of which only a subset is currently being returned.