© 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
        – 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)
  • Courses developed and taught by coreservlets.com experts (edited by Marty)
   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
  Developed and taught by well-known author and developer. At public venues or onsite at your location.
                                     Contact hall@coreservlets.com for details
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




4




                                                                                                 © 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
         • Requires JSON-specific server software
6        • 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 don’t
                                      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 =
           new JSONArray(biggestUSCities, false);
            e JSO     ay(b ggestUSC t es, a se);
         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/
            Servlets, JSP, JSF 1.x, JSF 2.0, Struts, Ajax, GWT 2.0, GXT, Spring, Hibernate/JPA, Java 5, Java 6.
26         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>
       <legend>JSON Data: Original MVC Approach</legend>
          g                   g          pp      / g
       <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>
       <legend>JSON Data: Automatic Conversion of Lists</legend>
          g                                              / g
       <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
       – Server code can adapt to arbitrary number of cities
                             p            y
       – 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
           • Client did not use timeZone and pop properties, but they
40
             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];
         var result = getTable(headings, rows);                Object property values are
                                                               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",
        "Indianapolis", "San Francisco", "Columbus", "Austin",
                p     ,                ,           ,         ,
        "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>
59   </fieldset>
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);
           List<City> c t es = new ArrayList<City>();
             st C ty cities     e      ay st C ty ();
           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.

Automatically generating-json-from-java-objects-java-objects268

  • 1.
    © 2010 MartyHall 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 – 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) • Courses developed and taught by coreservlets.com experts (edited by Marty) 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 Developed and taught by well-known author and developer. At public venues or onsite at your location. Contact hall@coreservlets.com for details
  • 2.
    Topics in ThisSection • 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 4 © 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.
  • 3.
    Using MVC toBuild 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 • Requires JSON-specific server software 6 • 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
  • 4.
    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
  • 5.
    © 2010 MartyHall 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
  • 6.
    Utilities for FindingBeans: 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 }
  • 7.
    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
  • 8.
    © 2010 MartyHall 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
  • 9.
    Steps for UsingJSON 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.
  • 10.
    Turning Beans intoJSON • 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
  • 11.
    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 don’t 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
  • 12.
    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 = new JSONArray(biggestUSCities, false); e JSO ay(b ggestUSC t es, a se); 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
  • 13.
    © 2010 MartyHall Comparing M C i Manual and l d Automatic JSON Generation 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. 26 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
  • 14.
    Manual Generation: ServerCode (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
  • 15.
    Manual Generation: ClientCode (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> <legend>JSON Data: Original MVC Approach</legend> g g pp / g <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
  • 16.
    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
  • 17.
    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
  • 18.
    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 }
  • 19.
    Automatic Generation: HTML Code <fieldset> <legend>JSON Data: Automatic Conversion of Lists</legend> g / g <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
  • 20.
    Automatic Generation: Pros and Cons • Advantages – Java code i very simple J d is i l – No JSP whatsoever – Server code can adapt to arbitrary number of cities p y – 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 • Client did not use timeZone and pop properties, but they 40 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.
  • 21.
    Building JSONObject fromMap • 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 }
  • 22.
    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
  • 23.
    Converting Maps: ServerCode (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
  • 24.
    Converting Maps: ClientCode (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]; var result = getTable(headings, rows); Object property values are 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
  • 25.
    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
  • 26.
    © 2010 MartyHall 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
  • 27.
    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
  • 28.
    Sending JSON toServer: 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", "Indianapolis", "San Francisco", "Columbus", "Austin", p , , , , "Memphis", "Fort Worth", "Baltimore", "Charlotte", "El Paso", "Milwaukeee", "Boston", "Seattle", "Washington DC", "Denver", "Louisville", "Las Vegas", "Nashville", "Oklahoma City", "Miami"]; 57
  • 29.
    Sending JSON toServer: 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> 59 </fieldset>
  • 30.
    Sending JSON toServer: 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); List<City> c t es = new ArrayList<City>(); st C ty cities e ay st C ty (); 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
  • 31.
    © 2010 MartyHall 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
  • 32.
    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.