This snippet describes how to send a JSON response from a Stripes action. Whereas the AJAX How-To article describes using Prototype's popular 'Ajax.Updater,' this uses Prototype's more granular 'Ajax.Request' in a shopping cart example.
First, add the relevant .java files. (You can also use JSON Tools, however it uses a different API to that described here.)
The action itself is similar to Calculator's:
public Resolution displayCart() { this.shoppingCart = ShoppingCartManager.getById(this.cartId); return new StreamingResolution("text", new StringReader(this.shoppingCart.JSONCart())); }
The only noteworthy difference is that the string it returns is a JSON object.
To see what this.shoppingCart.JSONCart() does, we peek into the DAO object:
public String JSONCart() { // create a JSONObject to hold relevant info for each item in cart and stuff all of these objects in a JSONArray JSONArray itemList = new JSONArray(); for (CartItem item : this.getItems()) { JSONObject ci= new JSONObject(); ci.put("productId", item.getProduct().getId()); ci.put("name", item.getProduct().getLabel()); // product name ci.put("price", item.getProduct().getPrice()); ci.put("quantity", item.getQuantity()); itemList.put(ci); } // place the array of item objects as well as other info inside another JSONObject for transport JSONObject jsonObj = new JSONObject(); jsonObj.put("cartId", this.getId()); jsonObj.put("otherStuff", this.getStuff()); jsonObj.put("itemList", itemList); // return the object as a JSON String return jsonObj.toString(); }
This might generate a string like:
{"cartId": 666, "otherStuff" : "moohahaha", "itemList": [{"productId" : 42, "name" : "brimstone", "price" : $6.66, "quantity" : 2000}]}
Now some javascript to retrieve the results and do something:
function displayCart(ajaxResponse)
{
var JSONobj = eval('('+ ajaxResponse.responseText +')');
if (JSONobj.cartId == 666)
{
$('promotions').innerHTML = "You win a free ton of brimstone!";
}
html = "<div class='items'>";
for (var i=0; i< JSONobj.itemList.length; i++)
{
var item = JSONobj.itemList[i];
html += "<li>" + item.name + "</li">
---snip---
}
new Insertion.Bottom('cart', html);
}
The eval statement var JSONobj = eval('('+ ajaxResponse.responseText +')'); takes the returned JSON stream and converts it into a JavaScript object, which can be accessed in the rest of your script. (note: rather than eval, it might be safer to use a JavaScript JSON parser.)