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 att http://courses.coreservlets.com/.
htt //
l t
/
Taught by the author of Core Servlets and JSP,
More Servlets and JSP,
JSP and this tutorial.
tutorial Available at
public venues, or customized versions can be held
on-site at your organization.
Courses
C
d
developed
l
d and
d ttaught
ht b
by M
Marty
t H
Hallll
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
library
(jQuery, Prototype/Scriptaculous,
Ext-JS, Dojo, Google Closure) or survey several
Customized
Java
Training:
http://courses.coreservlets.com/

Courses developed and taught by coreservlets.com experts (edited by Marty)

Servlets,
JSP,
JSF 1.x, JSF
2.0,Web
Struts,
Ajax,
GWT 2.0, GXT, Spring, Hibernate/JPA, Java 5, Java 6.
Spring,
Hibernate/JPA,
EJB3,
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
Often
Oft requires
i
knowledge
k
l d off how
h
server will
ill use data
d t

This section: turning Java into JSON


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

Disadvantages
Di d
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
y Free source code is available.

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


file, but you could easily build
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)
Widely
Wid l usedd
Used within other utilities (e.g., JSON-RPC)

Limited power

Alternatives
Alt
ti
Google Gson
Better support for generics
http://code.google.com/p/google-gson/
htt // d
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
coasts, subtracts 0-3
0 3 hours
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

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

12

Utilities for Finding Beans:


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

Lookup function

13

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);
}

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 Continued
ShowCities.java
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
tH d for
f Pragma
P
and
dC
Cache-Control
h C t l

Set Content-Type to text/javascript


response.setContentType("text/javascript");

Get PrintWriter in normal manner


PrintWriter out = response.getWriter

Get result as bean


bean, array
array, or Map
Call normal business logic code

Turn Java object into JSONObject


JSONObject result = new JSONObject(bean);
JSONArray result = new JSONArray(arrayOfBeans, false);
JSONObject
j result = new JSONObject(map);
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
f
from
application
li ti tto application.
li ti Oth
Other lilines stay
t exactly
tl as iis.

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
Its
I toString
S i method
h d builds
b ild JSON fformat

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");
JSONObj t sfJSON
JSONObject
fJSON = new JSONObject(sf);
JSONObj t( f)
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 JSONArray(javaArrayOrCollection)
JSONA
(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 p
previous section,, but you
y dont
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
JSONArray(biggestUSCities,
ay(b ggestUSC t es, false);
a se);
new
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"
AM", "name":"New York"
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"},
{"ti " "08 14 16 AM"
{"time":"08:14:16
AM", "name":"Houston",
"
" "H
t "
"timeZone":-1,"pop":2144491,"population":"2,144,491"},
{"time":"07:14:16 AM", "name":"Phoenix",
"ti Z
"timeZone":-2,"pop":1512986,"population":"1,512,986"}]
" 2 "
" 1512986 "
l ti " "1 512 986"}]

(White space added for readability)


25

2010 Marty Hall

Comparing
C
i
M
Manuall and
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,
ServletException IOException {
request.setAttribute("cities", cities);
String outputPage =
"/WEB INF/
"/WEB-INF/results/cities-json.jsp";
lt / iti
j
j "
RequestDispatcher dispatcher =
request.getRequestDispatcher(outputPage);
di
dispatcher.include(request,
t h
i l d (
t response);
)
}
}

27

Manual Generation: Server Code


(JSP)
{ headings: ["City", "Time", "Population"],
cities: [["${cities[0]
[["${cities[0].name}",
name}" "${cities[0]
"${cities[0].time}",
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 resultRegion);
showCityInfo1(request,
});
}

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
t t t
== 200)) {
var rawData = request.responseText;
var data = eval("(" + rawData + ")");
var table
t bl = getTable(data.headings,
tT bl (d t h di
d t
data.cities);
iti )
htmlInsert(resultRegion, table);
}
}
30

Manual Generation: HTML Code


<fieldset>
g
Data: Original
g
MVC Approach</legend>
pp
/ g
<legend>JSON
<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 pput it in form readyy for ppresentation.
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,
ServletException IOException {
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 resultRegion);
showCityInfo2(request,
});
}

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.

37

function showCityInfo2(request, resultRegion) {


if ((request.readyState == 4) &&
(request.status == 200)) {
var rawData = request.responseText;
var cities = eval(
eval("("
( + rawData + ")");
) );
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 table
t bl = getTable(headings,
tT bl (h di
rows);
)
htmlInsert(resultRegion, table);
}
}

Automatic Generation:
HTML Code
<fieldset>
g
Data: Automatic Conversion of Lists</legend>
/ g
<legend>JSON
<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

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

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 g
getBlah ((any
y return type)
yp ) or isBlah ((boolean return))
Calls each getter method
If myBean has getFoo and getBar, it builds object of the
form { "foo":
foo : "getFoo()
getFoo() result
result",, "bar":
bar : "getBar()
getBar() result
result"}}

new JSONObject(bean, true)


Same as above but includes inherited methods

Other
Oth constructors
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.*;

43

public class CityTest3 {


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

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 response);
doGet(request,
}
}

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
associated
ated values
a ues a
are
e a
arrays
ays o
of c
city
ty names.
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
y of cityy names ((cities
ht lI
htmlInsert(resultRegion,
t(
ltR i
result);
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
hhttp://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
json2 js in your HTML file

Call JSON.stringify on JavaScript object


Produces stringg in JSON format representing
p
g object
j

Call escape on result


URL-encode characters for transmission via HTTP

Send
S d in
i POST to
t client
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);
Server
S
needs
d tto know
k
the
th types
t
that
th t will
ill b
be sentt ffrom 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
[
New York",
York , "Los
Los Angeles
Angeles",
, "Chicago",
Chicago , "Houston",
Houston ,
"Phoenix", "Philadelphia", "San Antonio", "San Diego",
"Dallas", "San Jose", "Detroit", "Jacksonville",
p
, "San Francisco",
, "Columbus",
, "Austin",
,
"Indianapolis",
"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++) {
(
() < 0.25)
) {
if(Math.random()
randomCities[j++] = cityNames[i];
}
}
return(randomCities);
}

58

Sending JSON to Server:


HTML Code

59

<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
p src="./scripts/json2.js"
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>

Sending JSON to Server:


Server Code

60

public class ShowCities3 extends ShowCities {


protected List<City>
p
y g
getCities(HttpServletRequest
(
p
q
request)
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 c
cities
t es = new
e ArrayList<City>();
ay st C ty ();
List<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"));
}
}

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
client-side
side code
Client-side code passes and receives regular arguments
Passing:
g no need to escape
p data or build p
param strings
g
Receiving: no need to use responseText or eval

Simpler server-side code


Server-side
S
id code
d receives
i
andd returns regular
l arguments
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(),
myJSONObject toString() myJSONArray.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