Você está na página 1de 32

2010 Marty Hall

Automatically Generating JSON from Java Objects


Originals of Slides and Source Code for Examples: http://courses.coreservlets.com/Course Materials/ajax.html http://courses.coreservlets.com/Course-Materials/ajax.html
Customized Java EE Training: http://courses.coreservlets.com/
Servlets, JSP, JSF 1.x, JSF 2.0, Struts, Ajax, GWT 2.0, GXT, Spring, Hibernate/JPA, Java 5, Java 6. Developed and taught by well-known author and developer. At public venues or onsite at your location.

2010 Marty Hall

For live Ajax & GWT training, see training courses at http://courses.coreservlets.com/. t htt // l t /
Taught by the author of Core Servlets and JSP, More Servlets and JSP and this tutorial. Available at JSP, tutorial public venues, or customized versions can be held on-site at your organization.
C Courses d developed and t l d d taught b M t H ll ht by Marty Hall Courses developed and taught by coreservlets.com experts (edited by Marty)
Java 6, servlets/JSP (intermediate and advanced), Struts, JSF 1.x, JSF 2.0, Ajax, GWT 2.0 (with GXT), custom mix of topics Ajax courses can concentrate on 1EE Training: http://courses.coreservlets.com/ or survey several Customized Java library (jQuery, Prototype/Scriptaculous, Ext-JS, Dojo, Google Closure)

Servlets, JSP, JSF 1.x, JSF 2.0, Struts, Ajax, GWT 2.0, GXT, Spring, Hibernate/JPA, Java 5, Java 6. Spring, Hibernate/JPA, EJB3, Web Services, Ruby/Rails Contact hall@coreservlets.com for details Developed and taught by well-known author and developer. At public venues or onsite at your location.

Topics in This Section


Using org.json Java utilities
Building JSON object from bean Building JSON array from Java array or List Building JSON object from Map Other JSON-generation utilities

Using json2.js JavaScript utilities


Sending JSON objects to server

2010 Marty Hall

Intro and Setup


Customized Java EE Training: http://courses.coreservlets.com/
Servlets, JSP, JSF 1.x, JSF 2.0, Struts, Ajax, GWT 2.0, GXT, Spring, Hibernate/JPA, Java 5, Java 6. Developed and taught by well-known author and developer. At public venues or onsite at your location.

Using MVC to Build JSON


Last section: used MVC to build JSON
Advantages
Requires no special server software You have full control over result

Disadvantages
Tedious for complex data structures Oft requires knowledge of how server will use data Often i k l d fh ill d t

This section: turning Java into JSON


Advantages
Can generate complex data easily Builds real objects so server can decide what to do

Di d Disadvantages
6

Requires JSON-specific server software Sometimes builds objects with unneeded data in them

Installing the org.json.* Utilities


Download
http://www.json.org/java/json.zip
Or start at http://www.json.org/java/ and follow link that says Free source code is available. y

Install
Unzip to get org/json/*.java Put into src folder of Eclipse
Create new package org.json, then copy files there

They do not supply a JAR file but you could easily build file, one yourself, then put JAR file in WEB-INF/lib
Built org.json-utils.jar and put online at coreservlets.com

Documentation
http://www.json.org/java/
7

Configuring Eclipse Project

Used only in last example. Available for download at http://www.json.org/json2.js. You can also get compressed version; see http://www.json.org/js.html.

Used in all examples. Available for download at http://courses.coreservlets.com/Course-Materials/ajax.html http://courses coreservlets com/Course-Materials/ajax html Downloaded latest .java files from http://www.json.org/java/, compiled, and put resultant .class files in JAR file. Or, you can put .java files from http://www.json.org/java/ directly in src/org.json.
8

Other JSON-Generation Software


org.json utilities (used in this tutorial)
Wid l used Widely d
Used within other utilities (e.g., JSON-RPC)

Limited power

Alt Alternatives ti
Google Gson
Better support for generics htt // d http://code.google.com/p/google-gson/ l / / l /

JSON Taglib
More usable directly from JSP http://json taglib sourceforge net/ http://json-taglib.sourceforge.net/

VRaptor
Uses annotations for much of the work http://vraptor org/ajax html http://vraptor.org/ajax.html

Many more
See Java entry at http://json.org/
9

2010 Marty Hall

Supporting Java Code


(Used in All Examples)

Customized Java EE Training: http://courses.coreservlets.com/


Servlets, JSP, JSF 1.x, JSF 2.0, Struts, Ajax, GWT 2.0, GXT, Spring, Hibernate/JPA, Java 5, Java 6. Developed and taught by well-known author and developer. At public venues or onsite at your location.

Main Bean: City.java


Constructor
public City(String name, int timeZone, int pop) { setName(name); setTimeZone(timeZone); setPop(pop); }

Getter methods
getName getTime, getTimeZone
Assumes server is in US east coasts subtracts 0-3 hours coasts, 03 based on time zone

getPop
Raw population as an int

getPopulation
11

Formatted population as a String with commas

Utilities for Finding Beans: CityUtils.java CityUtils java


Map that associates city name with City
private static Map<String,City> biggestAmericanCities = new HashMap<String,City>();

Populate it with largest US cities

L k Lookup f functions ti
public static City getCity(String name) { name = name.toUpperCase(); return(biggestAmericanCities.get(name)); }

12

Utilities for Finding Beans: CityUtils.java CityUtils java Continued


Map that associates category of cities with city names i
private static Map<String,String[]> cityTypeMap;

Lookup function
public static List<City> findCities(String cityType) { String[] cityNames = cityTypeMap get(cityType); cityTypeMap.get(cityType); if (cityNames == null) { String[] twoCities = { "New York", "Los Angeles" }; cityNames = twoCities; } List<City> cities = new ArrayList<City>(); for(String cityName: cityNames) { cities.add(getCity(cityName)); cities add(getCity(cityName)); } return(cities); }

13

Parent Servlet Class: ShowCities.java ShowCities java


public abstract class ShowCities extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); response.setContentType("text/javascript"); List<City> cities = getCities(request); outputCities(cities, request, response); } protected List<City> getCities(HttpServletRequest request) { String cityType = request.getParameter("cityType"); return(CityUtils.findCities(cityType)); }

14

Parent Servlet Class: ShowCities.java ShowCities java Continued


public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } public abstract void outputCities (List<City> cities, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException; }

15

2010 Marty Hall

General Approach
Customized Java EE Training: http://courses.coreservlets.com/
Servlets, JSP, JSF 1.x, JSF 2.0, Struts, Ajax, GWT 2.0, GXT, Spring, Hibernate/JPA, Java 5, Java 6. Developed and taught by well-known author and developer. At public venues or onsite at your location.

Steps for Servlet Using JSON Utilities


Set normal response headers
response.setHeader f P tH d for Pragma and C h C t l d Cache-Control

Set Content-Type to text/javascript


response.setContentType("text/javascript");

Get PrintWriter in normal manner


PrintWriter out = response.getWriter

Get result as bean array or Map bean, array,


Call normal business logic code

Turn Java object into JSONObject


JSONObject result = new JSONObject(bean); JSONArray result = new JSONArray(arrayOfBeans, false); JSONObject result = new JSONObject(map); j j ( p)

Output JSONObject with print


out.print(result);
17

Steps for Using JSON Utilities: Sample Servlet Code


public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); response.setContentType("text/javascript"); PrintWriter out = response.getWriter(); SomeBean javaResult = callSomeBusinessLogic(); JSONObject jsonResult = new JSONObject(javaResult); p (j ); out.print(jsonResult); }
These two lines are the only ones that typically change from application t application. Oth li f li ti to li ti Other lines stay exactly as iis. t tl

18

2010 Marty Hall

Turning Java Beans j into JSONObject


Customized Java EE Training: http://courses.coreservlets.com/
Servlets, JSP, JSF 1.x, JSF 2.0, Struts, Ajax, GWT 2.0, GXT, Spring, Hibernate/JPA, Java 5, Java 6. Developed and taught by well-known author and developer. At public venues or onsite at your location.

Turning Beans into JSON


org.json defines JSONObject
I toString method builds JSON f Its S i h d b ild format

Most important constructor takes a bean


JSONObject json = new JSONObject(myBean);
Second arg of true means to include superclass info

Result
Uses reflection on myBean to find all public methods of the form getBlah (any return type) or isBlah (boolean return) Calls each getter method If myBean has getFoo and getBar, it builds object of the form { "foo": "getFoo() result", "bar": "getBar() result"}

Other capabilities
Can turn Map into JSONObject (keys become properties) Can add properties one at a time with put
20

JSONObject from Bean: Example Code


package coreservlets; import org.json.*; public class CityTest1 { public static void main(String[] args) { City sf = CityUtils.getCity("San Francisco"); JSONObject fJSON JSONObj t sfJSON = new JSONObj t( f) JSONObject(sf); System.out.println("JSON version of SF is:\n" + sfJSON); } }
Note: toString is automatically called when you print an Object in Java. It is the toString method of JSONObject that builds the JSON representation.
21

JSONObject from Bean: Example Result


JSON version of SF is: {"time": "06:00:55 AM" AM", "name": "San Francisco", "timeZone": -3, "pop": 744041, "population": " 744,041"}

(White space added for readability)

22

Building Arrays of JSON Info


org.json defines JSONArray
Its toString method outputs array in JSON format

Most important constructors


new JSONA JSONArray(javaArrayOrCollection) (j A O C ll i )
Assumes javaArrayOrCollection contains primitives, Strings, or JSONObjects

new JSONArray(javaArrayOrCollection, false)


Assumes javaArrayOrCollection contains beans that should be converted as in previous section, but you dont p , y want to include superclass info

new JSONArray(javaArrayOrCollection, true)


Assumes javaArrayOrCollection contains beans that should be converted as in previous section, but you do want to include superclass info
23

JSONArray: Example Code


package coreservlets; import org.json.*; import java.util.*; public class CityTest2 { public static void main(String[] args) { List<City> biggestUSCities = CityUtils.findCities("top-5-cities"); JSONArray citiesJSON = e JSO ay(b ggestUSC t es, a se); new JSONArray(biggestUSCities, false); System.out.println("JSON version of biggest " + "US cities is:\n" + ); citiesJSON); } }
24

JSONArray: Example Result


JSON version of biggest US cities is: [{"time":"09:14:16 AM" "name":"New York" AM", York", "timeZone":0,"pop":8250567,"population":"8,250,567"}, {"time":"06:14:16 AM", "name":"Los Angeles", "timeZone":-3,"pop":3849368,"population":"3,849,368"}, "timeZone": 3 "pop":3849368 "population":"3 849 368"} {"time":"08:14:16 AM", "name":"Chicago", "timeZone":-1,"pop":2873326,"population":"2,873,326"}, {"time":"08:14:16 AM", " {"ti " "08 14 16 AM" "name":"Houston", " "H t " "timeZone":-1,"pop":2144491,"population":"2,144,491"}, {"time":"07:14:16 AM", "name":"Phoenix", "timeZone":-2,"pop":1512986,"population":"1,512,986"}] "ti Z " 2 " " 1512986 " l ti " "1 512 986"}]

(White space added for readability)


25

2010 Marty Hall

Comparing M C i Manual and l d Automatic JSON Generation


Customized Java EE Training: http://courses.coreservlets.com/
26

Servlets, JSP, JSF 1.x, JSF 2.0, Struts, Ajax, GWT 2.0, GXT, Spring, Hibernate/JPA, Java 5, Java 6. Developed and taught by well-known author and developer. At public venues or onsite at your location.

Manual Generation: Server Code (Servlet)


public class ShowCities1 extends ShowCities { public void outputCities(List<City> cities cities, HttpServletRequest request, HttpServletResponse response) throws ServletException IOException { ServletException, request.setAttribute("cities", cities); String outputPage = "/WEB-INF/results/cities-json.jsp"; "/WEB INF/ lt / iti j j " RequestDispatcher dispatcher = request.getRequestDispatcher(outputPage); dispatcher.include(request, response); di t h i l d ( t ) } }

27

Manual Generation: Server Code (JSP)


{ headings: ["City", "Time", "Population"], cities: [["${cities[0] name}" "${cities[0] time}" [["${cities[0].name}", "${cities[0].time}", "${cities[0].population}"], ["${cities[1].name}", "${cities[1].time}", "${cities[1].population}"], ["${cities[2].name}", "${cities[2].time}", "${cities[2].population}"], ["${cities[3].name}", "${cities[3].time}", "${cities[3].population}"], [ ${ ["${cities[4].name}", "${cities[4].time}", [ ] } , ${ [ ] } , "${cities[4].population}"]] }

28

Manual Generation: Client Code


function cityTable1(address, inputField, resultRegion) { var data = "cityType=" + getValue(inputField); ajaxPost(address, data, function(request) { showCityInfo1(request, showCityInfo1(request resultRegion); }); }

Note:
ajaxPost shown in previous tutorial section
Sends data via POST and passes result to handler function

29

Manual Generation: Client Code (Continued)


// Data that arrives is JSON object with two properties: // - headings (an array of strings for the th elements) // - cities (an array of array of strings // matching the heading names) function showCityInfo1(request, resultRegion) { if ((request.readyState == 4) && (request.status == 200)) { ( t t t var rawData = request.responseText; var data = eval("(" + rawData + ")"); var t bl = getTable(data.headings, d t table tT bl (d t h di data.cities); iti ) htmlInsert(resultRegion, table); } }
30

Manual Generation: HTML Code


<fieldset> g g pp / g <legend>JSON Data: Original MVC Approach</legend> <form action="#"> <label for="city-type-1">City Type:</label> <select id="city-type-1"> <option value="top-5-cities">Largest Five US Cities</option> / <option value="second-5-cities">Second Five US Cities</option> /se ect </select> <br/> <input type="button" value="Show Cities" onclick='cityTable1("show-cities-1", "city-type-1", "json-city-table-1")'/> / </form> <p/> <div id="json-city-table-1"></div> id json city table 1 ></div> </fieldset>
31

Manual Generation: Results

32

Manual Generation: Pros and Cons


Advantages
Requires no JSON-specific software on server Java code is moderately simple Client code is simple

Disadvantages
JSP code is complex JSP code cannot adapt to arbitrary number of cities
This can be fixed with JSTL see next tutorial section

Server code needs to know a lot about how client code will use results. Server code essentially pre-processed the data and put it in form ready for p p y presentation.
If you are going to do that, why bother with data-centric Ajax? Why not just send HTML table from the server?
33

Automatic Generation: Server Code (Servlet)


public class ShowCities2 extends ShowCities { public void outputCities(List<City> cities cities, HttpServletRequest request, HttpServletResponse response) throws ServletException IOException { ServletException, PrintWriter out = response.getWriter(); out.println(new JSONArray(cities, false)); } }

34

Automatic Generation: Server Code (JSP)


None!

35

Automatic Generation: Client Code


function cityTable2(address, inputField, resultRegion) { var data = "cityType=" + getValue(inputField); ajaxPost(address, data, function(request) { showCityInfo2(request, showCityInfo2(request resultRegion); }); }

Note:
Only difference from previous example is that result is passed to showCityInfo2 instead of ShowCityInfo1

36

Automatic Generation: Client Code (Continued)


// Data that arrives is an array of city objects. // City objects contain (among other things) // name, time, and population properties. function showCityInfo2(request, resultRegion) { if ((request.readyState == 4) && (request.status == 200)) { var rawData = request.responseText; var cities = eval("(" + rawData + ")"); eval( ( ) ); var headings = ["City", "Time", "Population"]; var rows = new Array(); for(var i=0; i<cities.length; i++) { var city = cities[i]; rows[i] = [city.name, city.time, city.population]; } var t bl = getTable(headings, rows); table tT bl (h di ) htmlInsert(resultRegion, table); } }

37

Automatic Generation: HTML Code


<fieldset> g / g <legend>JSON Data: Automatic Conversion of Lists</legend> <form action="#"> <label for="city-type-2">City Type:</label> <select id="city-type-2"> <option value="top-5-cities">Largest Five US Cities</option> / <option value="second-5-cities">Second Five US Cities</option> /se ect </select> <br/> <input type="button" value="Show Cities" onclick='cityTable2("show-cities-2", "city-type-2", "json-city-table-2")'/> / </form> <p/> <div id="json-city-table-2"></div> id json city table 2 ></div> </fieldset>
38

Automatic Generation: Results

39

Automatic Generation: Pros and Cons


Advantages
Java code i very simple J d is i l No JSP whatsoever p y Server code can adapt to arbitrary number of cities Server code does not need to know how client code will use the result Client code has real data so can do logic based on it real

Disadvantages
Requires JSON-specific software on server Client code is more complex
It needs to extract data from objects before sending it to table-building function

Extra fields were sent


40

Client did not use timeZone and pop properties, but they were sent anyway

2010 Marty Hall

Turning Java Maps into JSONObject j


Customized Java EE Training: http://courses.coreservlets.com/
Servlets, JSP, JSF 1.x, JSF 2.0, Struts, Ajax, GWT 2.0, GXT, Spring, Hibernate/JPA, Java 5, Java 6. Developed and taught by well-known author and developer. At public venues or onsite at your location.

Building JSONObject from Map


Most important JSONObject constructors
new JSONObject(bean)
Uses reflection on myBean to find all public methods of the form getBlah (any return type) or isBlah (boolean return) g ( y yp ) ( ) Calls each getter method If myBean has getFoo and getBar, it builds object of the form { "foo": "getFoo() result , "bar": "getBar() result } foo : getFoo() result", bar : getBar() result"}

new JSONObject(bean, true)


Same as above but includes inherited methods

Oth constructors Other t t


new JSONObject(map)
Map keys become JSON property names

new JSONObject(string)
42

Useful when passing JSON to the server

JSONObject from Map: Example Code


package coreservlets; import org.json.*; import java.util.*; public class CityTest3 { public static void main(String[] args) { Map<String,String[]> cities = M <St i St i []> iti CityUtils.getCityTypeMap(); JSONObject citiesJSON = new JSONObject(cities); ( ) System.out.println("JSON version of map of " + "US cities is:\n" + citiesJSON); } }

43

JSONObject from Map: Example Result


JSON version of map of US cities is: { superbowl hosts : {"superbowl-hosts": ["Phoenix","Miami", "Detroit","Jacksonville","Houston"], top 5 cities : "top-5-cities": ["New York","Los Angeles", "Chicago","Houston","Phoenix"], cities starting with s : "cities-starting-with-s": ["San Antonio","San Diego", "San Jose","San Francisco","Seattle"], seco d 5 c t es : "second-5-cities": ["Philadelphia","San Antonio", "San Diego","Dallas","San Jose"]}

(White space added for readability)


44

Converting Maps: Server Code


public class ShowCityTypes extends HttpServlet { public void doGet(HttpServletRequest request request, HttpServletResponse response) throws ServletException, IOException { response.setHeader( Cache Control response setHeader("Cache-Control", "no-cache"); no cache ); response.setHeader("Pragma", "no-cache"); response.setContentType("text/javascript"); PrintWriter out = response.getWriter(); JSONObject cityTypes = new JSONObject(CityUtils.getCityTypeMap()); out.p out.println(cityTypes); t (c ty ypes); }

45

Converting Maps: Server Code (Continued)


public void doPost(HttpServletRequest request request, HttpServletResponse response) throws ServletException, IOException { doGet(request, doGet(request response); } }

46

Converting Maps: Client Code


function cityTypeList(address, resultRegion) { ajaxPost(address, null, ajaxPost(address null function(request) { showCityTypeInfo(request, resultRegion); }); }

// Data that arrives is an object where the // properties are city categories and the // assoc ated values a e a ays o c ty names. associated a ues are arrays of city a es.

47

Converting Maps: Client Code (Continued)


function showCityTypeInfo(request, resultRegion) { if ((request.readyState == 4) && (request.status == 200)) { var rawData = request.responseText; var cityTypes = eval("(" + rawData + ")"); var headings = new Array(); Object property names are city var row1Entries = new Array(); categories like top-5-cities var i = 0; for(var cityType in cityTypes) { headings[i] = cityType; row1Entries[i] = getBulletedList(cityTypes[cityType]); i++; } var rows = [row1Entries]; Object property values are var result = getTable(headings, rows); arrays of city names ( y y (cities htmlInsert(resultRegion, result); ht lI t( ltR i lt) that match the category) } }
48

Converting Maps: Client Code (Continued)


function getBulletedList(listItems) { var list = "<ul>\n"; for(var i=0; i<listItems.length; i++) { list = list + " <li>" + listItems[i] + "</li>\n"; } list = list + "</ul>" return(list); }

49

Converting Maps: HTML Code


<fieldset> <legend>JSON Data: Automatic Conversion of Maps</legend> <form action="#"> <input type="button" value="Show City Types" onclick cityTypeList( show city types , onclick='cityTypeList("show-city-types", "city-types")'/> </form> <p/> p/ <div id="city-types"></div> </fieldset>

50

Converting Maps: Results

51

2010 Marty Hall

Sending JSON Data from Client to Server


Customized Java EE Training: http://courses.coreservlets.com/
Servlets, JSP, JSF 1.x, JSF 2.0, Struts, Ajax, GWT 2.0, GXT, Spring, Hibernate/JPA, Java 5, Java 6. Developed and taught by well-known author and developer. At public venues or onsite at your location.

Using JSON.stringify
Download json2.js
h // http://www.json.org/json2.js j /j 2 j Or, start at http://www.json.org/js.html and follow links at bottom of page

Install in your project


E.g., in Eclipse, drop in WebContent/scripts Load json2.js in your HTML file json2 js

Call JSON.stringify on JavaScript object


Produces string in JSON format representing object g p g j

Call escape on result


URL-encode characters for transmission via HTTP

S d in POST to client Send i t li t


Data might be large, so POST is better than GET
53

Utility Function
function makeJsonString(object) { return(escape(JSON.stringify(object))); }

54

Receiving JSON Objects on Server


Pass string to JSONObject or JSONArray constructor
String jsonString = request.getParameter(); JSONArray myArray = new JSONArray(jsonString);

Access elements with getBlah methods


Primitives
getInt, getDouble, getString, getBoolean, isNull double d = myArray.getDouble(0);
S Server needs t know the types that will b sent f d to k th t th t ill be t from client li t

High-level
getJSONObject, getJSONArray

55

Sending JSON to Server: Client Code


function randomCityTable(address, resultRegion) { var data = "cityNames=" + cityNames= makeJsonString(getRandomCities()); ajaxPost(address, data, function(request) { showCityInfo2(request, resultRegion); }); }
This is the same showCityInfo2 function used earlier. Takes an array of city objects and makes HTML table from their names, times, and populations.

56

Sending JSON to Server: Client Code (Continued)


var cityNames = [ New York , Los Angeles", Chicago , Houston , ["New York", "Los Angeles , "Chicago", "Houston", "Phoenix", "Philadelphia", "San Antonio", "San Diego", "Dallas", "San Jose", "Detroit", "Jacksonville", p , , , , "Indianapolis", "San Francisco", "Columbus", "Austin", "Memphis", "Fort Worth", "Baltimore", "Charlotte", "El Paso", "Milwaukeee", "Boston", "Seattle", "Washington DC", "Denver", "Louisville", "Las Vegas", "Nashville", "Oklahoma City", "Miami"];

57

Sending JSON to Server: Client Code (Continued)


function getRandomCities() { var randomCities = new Array(); var j = 0; for(var i=0; i<cityNames.length; i++) { ( () ) if(Math.random() < 0.25) { randomCities[j++] = cityNames[i]; } } return(randomCities); }

58

Sending JSON to Server: HTML Code


<script src="./scripts/ajax-utils.js" type text/javascript ></script> type="text/javascript"></script> <script src="./scripts/json-generation-examples.js" type="text/javascript"></script> <script src="./scripts/json2.js" p p j j type="text/javascript"></script> <fieldset> <legend>JSON Data: Sending JSON <i>to</i> Server</legend> <form action="#"> <input type="button" value="Show Random Cities" onclick='randomCityTable("show-cities-3", "json-city-table-3")'/> </form> <p/> <div id="json-city-table-3"></div> </fieldset>

59

Sending JSON to Server: Server Code


public class ShowCities3 extends ShowCities { p protected List<City> getCities(HttpServletRequest request) { y g ( p q q ) String cityNames = request.getParameter("cityNames"); if ((cityNames == null) || (cityNames.trim().equals(""))) { cityNames = "['New York', 'Los Angeles]"; } try { JSONArray jsonCityNames = new JSONArray(cityNames); st C ty cities e ay st C ty (); List<City> c t es = new ArrayList<City>(); for(int i=0; i<jsonCityNames.length(); i++) { City city = CityUtils.getCityOrDefault(jsonCityNames.getString(i)); cities.add(city); } return(cities); } catch(JSONException jse) { return(CityUtils.findCities("top-5-cities")); } }

60

Sending JSON to Server: Results

61

2010 Marty Hall

Wrap-up
Customized Java EE Training: http://courses.coreservlets.com/
Servlets, JSP, JSF 1.x, JSF 2.0, Struts, Ajax, GWT 2.0, GXT, Spring, Hibernate/JPA, Java 5, Java 6. Developed and taught by well-known author and developer. At public venues or onsite at your location.

Preview of Next Section: JSON-RPC


Simpler designation of server-side resource
Client-side code acts as if it is calling a server-side function (not a URL)

Simpler client side code client-side


Client-side code passes and receives regular arguments
Passing: no need to escape data or build param strings g p p g Receiving: no need to use responseText or eval

Simpler server-side code


S Server-side code receives and returns regular arguments id d i d l
Receiving: no need to call request.getParamter & convert Returning: results automatically converted with JSONObject and JSONArray
63

Summary
Building JSON from Java
new JSONObject(bean) new JSONArray(arrayOrCollectionOfBeans, false) new JSONObject(map)

Outputting JSON String


myJSONObject toString() myJSONArray toString() myJSONObject.toString(), myJSONArray.toString()
When you do out.print, toString is invoked automatically

Sending JSON to server


escape(JSON.stringify(javaScriptObject))

Receiving JSON on server


new JSONObject(string) or new JSONArray(string) myArray.getString(i), myArray.getDouble(i), etc.
64

2010 Marty Hall

Questions?
Customized Java EE Training: http://courses.coreservlets.com/
Servlets, JSP, JSF 1.x, JSF 2.0, Struts, Ajax, GWT 2.0, GXT, Spring, Hibernate/JPA, Java 5, Java 6. Developed and taught by well-known author and developer. At public venues or onsite at your location.

Você também pode gostar