Java/GWT/JSON
Class that acts as a client to a JSON service
<source lang="java">
/*
* Copyright 2006 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */
package com.google.gwt.sample.json.client; import com.google.gwt.json.client.JSONArray; import com.google.gwt.json.client.JSONException; import com.google.gwt.json.client.JSONObject; import com.google.gwt.json.client.JSONParser; import com.google.gwt.json.client.JSONString; import com.google.gwt.json.client.JSONValue; import com.google.gwt.user.client.HTTPRequest; import com.google.gwt.user.client.ResponseTextHandler; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.ClickListener; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.Tree; import com.google.gwt.user.client.ui.TreeItem; import com.google.gwt.user.client.ui.Widget; import java.util.Iterator; import java.util.Set; /**
* Class that acts as a client to a JSON service. Currently, this client just * requests a text which contains a JSON encoding of a search result set from * yahoo. We use a text file to demonstrate how the pieces work without tripping * on cross-site scripting issues. * * If you would like to make this a more dynamic example, you can associate a * servlet with this example and simply have it hit the yahoo service and return * the results. */
public class JSON {
/** * Class for handling the response text associated with a request for a JSON * object. * */ private class JSONResponseTextHandler implements ResponseTextHandler { public void onCompletion(String responseText) { try { JSONValue jsonValue = JSONParser.parse(responseText); displayJSONObject(jsonValue); } catch (JSONException e) { displayError(responseText); } searchButton.setText(SEARCH_BUTTON_DEFAULT_TEXT); } } /* * Class for handling the fetch button"s click event. */ private class SearchButtonClickListener implements ClickListener { public void onClick(Widget sender) { jsonTree.setVisible(false); doFetchURL(); } } /* * Default URL to use to fetch JSON objects. Note that the contents of this * JSON result were as a result of requesting the following URL: * * http://api.search.yahoo.ru/ImageSearchService/V1/imageSearch?appid=YahooDemo&query=potato&results=2&output=json * */ private static final String DEFAULT_SEARCH_URL = "search-results.js"; /* * Text displayed on the fetch button when we are in a default state. */ private static final String SEARCH_BUTTON_DEFAULT_TEXT = "Search"; /* * Text displayed on the fetch button when we are waiting for a JSON reply. */ private static final String SEARCH_BUTTON_WAITING_TEXT = "Waiting for JSON Response..."; private Tree jsonTree = new Tree(); private Button searchButton = new Button(); /** * Entry point for this simple application. Currently, we build the * application"s form and wait for events. */ public void onModuleLoad() { initializeMainForm(); } /* * Add the object presented by the JSONValue as a children to the requested * TreeItem. */ private void addChildren(TreeItem treeItem, JSONValue jsonValue) { JSONArray jsonArray; JSONObject jsonObject; JSONString jsonString; if ((jsonArray = jsonValue.isArray()) != null) { for (int i = 0; i < jsonArray.size(); ++i) { TreeItem child = treeItem.addItem(getChildText("[" + Integer.toString(i) + "]")); addChildren(child, jsonArray.get(i)); } } else if ((jsonObject = jsonValue.isObject()) != null) { Set keys = jsonObject.keySet(); for (Iterator iter = keys.iterator(); iter.hasNext();) { String key = (String) iter.next(); TreeItem child = treeItem.addItem(getChildText(key)); addChildren(child, jsonObject.get(key)); } } else if ((jsonString = jsonValue.isString()) != null) { // Use stringValue instead of toString() because we don"t want escaping treeItem.addItem(jsonString.stringValue()); } else { // JSONBoolean, JSONNumber, and JSONNull work well with toString(). treeItem.addItem(getChildText(jsonValue.toString())); } } private void displayError(String responseText) { jsonTree.removeItems(); jsonTree.setVisible(true); TreeItem treeItem = jsonTree.addItem("Failed to parse JSON response"); treeItem.addItem(responseText); treeItem.setStyleName("JSON-JSONResponseObject"); treeItem.setState(true); } /* * Update the treeview of a JSON object. */ private void displayJSONObject(JSONValue jsonValue) { jsonTree.removeItems(); jsonTree.setVisible(true); TreeItem treeItem = jsonTree.addItem("JSON Response"); addChildren(treeItem, jsonValue); treeItem.setStyleName("JSON-JSONResponseObject"); treeItem.setState(true); } /* * Fetch the requested URL. */ private void doFetchURL() { searchButton.setText(SEARCH_BUTTON_WAITING_TEXT); if (!HTTPRequest.asyncGet(DEFAULT_SEARCH_URL, new JSONResponseTextHandler())) { // Reset the caption. // searchButton.setText(SEARCH_BUTTON_DEFAULT_TEXT); } } /* * Causes the text of child elements to wrap. */ private String getChildText(String text) { return "" + text + ""; } /** * Initialize the main form"s layout and content. */ private void initializeMainForm() { searchButton.setStyleName("JSON-SearchButton"); searchButton.setText(SEARCH_BUTTON_DEFAULT_TEXT); searchButton.addClickListener(new SearchButtonClickListener()); // Avoids showing an "empty" cell jsonTree.setVisible(false); // Find out where the host page wants the button. // RootPanel searchButtonSlot = RootPanel.get("search"); if (searchButtonSlot == null) { Window.alert("Please define a container element whose id is "search""); return; } // Find out where the host page wants the tree view. // RootPanel treeViewSlot = RootPanel.get("tree"); if (treeViewSlot == null) { Window.alert("Please define a container element whose id is "tree""); return; } // Add both widgets. // searchButtonSlot.add(searchButton); treeViewSlot.add(jsonTree); }
}
</source>