Reading JSON Data with Dojo
Last time we discussed the high level details of the Read, Identity, Write, and Notification APIs that together comprise what the Dojo Data API. These abstract APIs are implemented by various core implementations called stores that read specific dataset types including JSON, XML, CSV and web services from Google, Flickr, and others. Today we’re going to discuss ItemFileReadStore which is Dojo’s core implementation for JSON format data.
What is JSON?
Dojo uses the ItemFileReadStore and ItemFileWriteStore data stores to work with JSON format data. ItemFileReadStore implements the Read and Identity APIs and is used to read JSON data while ItemFileWriteStore is used to write JSON format data and implements all four of the Data APIs. We’ll be discussing ItemFileReadStore in this post.
ItemFileReadStore is the specific data store implementation for reading JSON data. In addition to implementing the Read and Identity APIs, ItemFileReadStore also contains additional implementation features including a specific data format, query syntax, means for deserializing attribute values, identifiers for items, and others. Now let’s look at an example of the data format expected by ItemFileReadStore.
ItemFileReadStore requires that JSON data follow a specific structure which is outlined via a code example shown in the figure below.
The identifier property points to the identifier attribute in items. An optional label property points to the label attribute. Finally, the data itself comes in items, which is an array of attribute/value pairs. The test data shown in the example was taken from a JSON file containing wildfire information. Ultimately each of these wildfires is plotted to our sample Google Maps application as a marker. Each wildfire is given a unique numeric identifier and the label is simply the latitude and longitude coordinates combined. The items are a collection of attribute/value pairs listing information about the specific fire including the coordinates, date, time, satellite that identified the fire, and the confidence value.
Instances of ItemFileReadStore can be created in your code either declaratively or programmatically. In either case, the end result is the same in terms of what the user sees. Declarative creation is easily accomplished through the use of dojoType as seen in the code below. The ‘url’ attribute is used to point to the location of your JSON format file. Here it is assumed that the file is located in the same folder as your application, but this could also be a fully qualified url. You will also want to assign an ID to the instance so that it can be referred to later in your application.
Programmatic creation of ItemFileReadStore is accomplished using a constructor as seen below. Here we are passing in the url to our file. The end result is a new instance of ItemFileReadStore which is referenced by the variable itmFileReadStore.
Applying a Query
You can apply a query to an instance of ItemFileReadStore to create a subset of the data returned by ItemFileReadStore. The Fetch() method can be used to execute a query against the data store. The query should take the format you see in the figure below where the word ‘query’ is followed by a colon and then the query attributes inside curly brackets.
You can also specify additional queryOptions of ignoreCase and deep. In addition to providing the ability to query a data store, the Fetch method also provides a number of callback for handling the return events.
ItemFileReadStore.Fetch provides the ability to query the data store similar to a SELECT statement in SQL. To apply an ‘AND’ condition to the query you simply separate the items with a comma which serves as an implied ‘AND’. In the code example below we are querying for all items with a satellite value of ‘T’ AND a date of ‘03312009’.
As I mentioned earlier this is only a semi-standard version of SQL so you can’t use OR, NOT, set operations, numerical comparison operators, or joins. You are pretty much limited to ‘AND’ conditions supported by wildcard operators. The wildcard operators include an asterisk for matching multiple characters and a question mark for matching a single character. Furthermore, you can also use the ‘ignoreCase’ and ‘deep’ queryOptions. By default both options are set to ‘false’. Ignore case is self descriptive so I won’t go into detail on this other than to say that setting this value to ‘true’ will ignore upper and lower case characters that match the query. The ‘deep’ option triggers a query of all items and child items instead of only items at the root level.
Search by Identifier
As you’ll recall from earlier in the discussion an ItemFileReadStore object implements the Identity API as well as the Read API. The Identity API provides for the implementation of a fetch by an identifier through the fetchItemByIdentity method. The identifier is a unique value and the fetchItemByIdentity method can search through your JSON file or stream for a specific value. There are two event handlers that can be used to process the item or handle any errors. onItem is used to process the returned item while onError is used to process errors. This process is described in the figure below.