<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FGWT%2FJSON</id>
		<title>Java/GWT/JSON - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FGWT%2FJSON"/>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/GWT/JSON&amp;action=history"/>
		<updated>2026-04-23T02:42:41Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/GWT/JSON&amp;diff=7017&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/GWT/JSON&amp;diff=7017&amp;oldid=prev"/>
				<updated>2010-06-01T06:35:23Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 06:35, 1 июня 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>	</entry>

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

	</feed>