SlideShare a Scribd company logo
© 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.

More Related Content

What's hot (19)

JSON
JSON
Yoga Raja
 
Java script
Java script
Yoga Raja
 
Basics of JSON (JavaScript Object Notation) with examples
Basics of JSON (JavaScript Object Notation) with examples
Sanjeev Kumar Jaiswal
 
Ajax
Ajax
Manav Prasad
 
JSLT: JSON querying and transformation
JSLT: JSON querying and transformation
Lars Marius Garshol
 
JavaScript - From Birth To Closure
JavaScript - From Birth To Closure
Robert Nyman
 
JSON-(JavaScript Object Notation)
JSON-(JavaScript Object Notation)
Skillwise Group
 
5 Tips for Better JavaScript
5 Tips for Better JavaScript
Todd Anglin
 
JSON
JSON
yogendra singh chahar
 
Json - ideal for data interchange
Json - ideal for data interchange
Christoph Santschi
 
Reversing JavaScript
Reversing JavaScript
Roberto Suggi Liverani
 
Java Development with MongoDB
Java Development with MongoDB
Scott Hernandez
 
Data collection in AWS at Schibsted
Data collection in AWS at Schibsted
Lars Marius Garshol
 
Elasticsearch And Ruby [RuPy2012]
Elasticsearch And Ruby [RuPy2012]
Karel Minarik
 
Java and XML
Java and XML
Raji Ghawi
 
Elasticsearch (Rubyshift 2013)
Elasticsearch (Rubyshift 2013)
Karel Minarik
 
A Re-Introduction to JavaScript
A Re-Introduction to JavaScript
Simon Willison
 
Elasticsearch in 15 Minutes
Elasticsearch in 15 Minutes
Karel Minarik
 
Beginning Object-Oriented JavaScript
Beginning Object-Oriented JavaScript
Stoyan Stefanov
 
Basics of JSON (JavaScript Object Notation) with examples
Basics of JSON (JavaScript Object Notation) with examples
Sanjeev Kumar Jaiswal
 
JSLT: JSON querying and transformation
JSLT: JSON querying and transformation
Lars Marius Garshol
 
JavaScript - From Birth To Closure
JavaScript - From Birth To Closure
Robert Nyman
 
JSON-(JavaScript Object Notation)
JSON-(JavaScript Object Notation)
Skillwise Group
 
5 Tips for Better JavaScript
5 Tips for Better JavaScript
Todd Anglin
 
Json - ideal for data interchange
Json - ideal for data interchange
Christoph Santschi
 
Java Development with MongoDB
Java Development with MongoDB
Scott Hernandez
 
Data collection in AWS at Schibsted
Data collection in AWS at Schibsted
Lars Marius Garshol
 
Elasticsearch And Ruby [RuPy2012]
Elasticsearch And Ruby [RuPy2012]
Karel Minarik
 
Elasticsearch (Rubyshift 2013)
Elasticsearch (Rubyshift 2013)
Karel Minarik
 
A Re-Introduction to JavaScript
A Re-Introduction to JavaScript
Simon Willison
 
Elasticsearch in 15 Minutes
Elasticsearch in 15 Minutes
Karel Minarik
 
Beginning Object-Oriented JavaScript
Beginning Object-Oriented JavaScript
Stoyan Stefanov
 

Similar to Automatically generating-json-from-java-objects-java-objects268 (20)

Json generation
Json generation
Aravindharamanan S
 
Ajax Tags Advanced
Ajax Tags Advanced
AkramWaseem
 
Prototype-1
Prototype-1
tutorialsruby
 
Prototype-1
Prototype-1
tutorialsruby
 
15 expression-language
15 expression-language
snopteck
 
13 java beans
13 java beans
snopteck
 
&lt;img src="../i/r_14.png" />
&lt;img src="../i/r_14.png" />
tutorialsruby
 
jQuery-1-Ajax
jQuery-1-Ajax
guestcf600a
 
Microsoft PowerPoint - &lt;b>jQuery&lt;/b>-1-Ajax.pptx
Microsoft PowerPoint - &lt;b>jQuery&lt;/b>-1-Ajax.pptx
tutorialsruby
 
jQuery-1-Ajax
jQuery-1-Ajax
guestcf600a
 
14 mvc
14 mvc
snopteck
 
02 servlet-basics
02 servlet-basics
snopteck
 
Ajax basics
Ajax basics
amanrahulraj
 
java beans
java beans
lapa
 
10 jdbc
10 jdbc
snopteck
 
10 jdbc
10 jdbc
snopteck
 
Ajax Basics 1
Ajax Basics 1
bhuvanann
 
JavaScript-Core
JavaScript-Core
tutorialsruby
 
JavaScript-Core
JavaScript-Core
tutorialsruby
 
Java script core
Java script core
Vaishnu Vaishu
 
Ajax Tags Advanced
Ajax Tags Advanced
AkramWaseem
 
15 expression-language
15 expression-language
snopteck
 
13 java beans
13 java beans
snopteck
 
&lt;img src="../i/r_14.png" />
&lt;img src="../i/r_14.png" />
tutorialsruby
 
Microsoft PowerPoint - &lt;b>jQuery&lt;/b>-1-Ajax.pptx
Microsoft PowerPoint - &lt;b>jQuery&lt;/b>-1-Ajax.pptx
tutorialsruby
 
02 servlet-basics
02 servlet-basics
snopteck
 
java beans
java beans
lapa
 
Ajax Basics 1
Ajax Basics 1
bhuvanann
 
Ad

Recently uploaded (20)

vertical-cnc-processing-centers-drillteq-v-200-en.pdf
vertical-cnc-processing-centers-drillteq-v-200-en.pdf
AmirStern2
 
Enabling BIM / GIS integrations with Other Systems with FME
Enabling BIM / GIS integrations with Other Systems with FME
Safe Software
 
Analysis of the changes in the attitude of the news comments caused by knowin...
Analysis of the changes in the attitude of the news comments caused by knowin...
Matsushita Laboratory
 
MuleSoft for AgentForce : Topic Center and API Catalog
MuleSoft for AgentForce : Topic Center and API Catalog
shyamraj55
 
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Alliance
 
Introduction to Typescript - GDG On Campus EUE
Introduction to Typescript - GDG On Campus EUE
Google Developer Group On Campus European Universities in Egypt
 
Supporting the NextGen 911 Digital Transformation with FME
Supporting the NextGen 911 Digital Transformation with FME
Safe Software
 
FME for Good: Integrating Multiple Data Sources with APIs to Support Local Ch...
FME for Good: Integrating Multiple Data Sources with APIs to Support Local Ch...
Safe Software
 
No-Code Workflows for CAD & 3D Data: Scaling AI-Driven Infrastructure
No-Code Workflows for CAD & 3D Data: Scaling AI-Driven Infrastructure
Safe Software
 
TrustArc Webinar - 2025 Global Privacy Survey
TrustArc Webinar - 2025 Global Privacy Survey
TrustArc
 
FIDO Seminar: New Data: Passkey Adoption in the Workforce.pptx
FIDO Seminar: New Data: Passkey Adoption in the Workforce.pptx
FIDO Alliance
 
cnc-drilling-dowel-inserting-machine-drillteq-d-510-english.pdf
cnc-drilling-dowel-inserting-machine-drillteq-d-510-english.pdf
AmirStern2
 
“From Enterprise to Makers: Driving Vision AI Innovation at the Extreme Edge,...
“From Enterprise to Makers: Driving Vision AI Innovation at the Extreme Edge,...
Edge AI and Vision Alliance
 
War_And_Cyber_3_Years_Of_Struggle_And_Lessons_For_Global_Security.pdf
War_And_Cyber_3_Years_Of_Struggle_And_Lessons_For_Global_Security.pdf
biswajitbanerjee38
 
National Fuels Treatments Initiative: Building a Seamless Map of Hazardous Fu...
National Fuels Treatments Initiative: Building a Seamless Map of Hazardous Fu...
Safe Software
 
Providing an OGC API Processes REST Interface for FME Flow
Providing an OGC API Processes REST Interface for FME Flow
Safe Software
 
Your startup on AWS - How to architect and maintain a Lean and Mean account J...
Your startup on AWS - How to architect and maintain a Lean and Mean account J...
angelo60207
 
June Patch Tuesday
June Patch Tuesday
Ivanti
 
Down the Rabbit Hole – Solving 5 Training Roadblocks
Down the Rabbit Hole – Solving 5 Training Roadblocks
Rustici Software
 
Data Validation and System Interoperability
Data Validation and System Interoperability
Safe Software
 
vertical-cnc-processing-centers-drillteq-v-200-en.pdf
vertical-cnc-processing-centers-drillteq-v-200-en.pdf
AmirStern2
 
Enabling BIM / GIS integrations with Other Systems with FME
Enabling BIM / GIS integrations with Other Systems with FME
Safe Software
 
Analysis of the changes in the attitude of the news comments caused by knowin...
Analysis of the changes in the attitude of the news comments caused by knowin...
Matsushita Laboratory
 
MuleSoft for AgentForce : Topic Center and API Catalog
MuleSoft for AgentForce : Topic Center and API Catalog
shyamraj55
 
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Alliance
 
Supporting the NextGen 911 Digital Transformation with FME
Supporting the NextGen 911 Digital Transformation with FME
Safe Software
 
FME for Good: Integrating Multiple Data Sources with APIs to Support Local Ch...
FME for Good: Integrating Multiple Data Sources with APIs to Support Local Ch...
Safe Software
 
No-Code Workflows for CAD & 3D Data: Scaling AI-Driven Infrastructure
No-Code Workflows for CAD & 3D Data: Scaling AI-Driven Infrastructure
Safe Software
 
TrustArc Webinar - 2025 Global Privacy Survey
TrustArc Webinar - 2025 Global Privacy Survey
TrustArc
 
FIDO Seminar: New Data: Passkey Adoption in the Workforce.pptx
FIDO Seminar: New Data: Passkey Adoption in the Workforce.pptx
FIDO Alliance
 
cnc-drilling-dowel-inserting-machine-drillteq-d-510-english.pdf
cnc-drilling-dowel-inserting-machine-drillteq-d-510-english.pdf
AmirStern2
 
“From Enterprise to Makers: Driving Vision AI Innovation at the Extreme Edge,...
“From Enterprise to Makers: Driving Vision AI Innovation at the Extreme Edge,...
Edge AI and Vision Alliance
 
War_And_Cyber_3_Years_Of_Struggle_And_Lessons_For_Global_Security.pdf
War_And_Cyber_3_Years_Of_Struggle_And_Lessons_For_Global_Security.pdf
biswajitbanerjee38
 
National Fuels Treatments Initiative: Building a Seamless Map of Hazardous Fu...
National Fuels Treatments Initiative: Building a Seamless Map of Hazardous Fu...
Safe Software
 
Providing an OGC API Processes REST Interface for FME Flow
Providing an OGC API Processes REST Interface for FME Flow
Safe Software
 
Your startup on AWS - How to architect and maintain a Lean and Mean account J...
Your startup on AWS - How to architect and maintain a Lean and Mean account J...
angelo60207
 
June Patch Tuesday
June Patch Tuesday
Ivanti
 
Down the Rabbit Hole – Solving 5 Training Roadblocks
Down the Rabbit Hole – Solving 5 Training Roadblocks
Rustici Software
 
Data Validation and System Interoperability
Data Validation and System Interoperability
Safe Software
 
Ad

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

  • 1. © 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 [email protected] for details
  • 2. 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.
  • 3. 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
  • 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 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
  • 6. 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 }
  • 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 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
  • 9. 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.
  • 10. 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
  • 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 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
  • 14. 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
  • 15. 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
  • 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 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 }
  • 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: 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
  • 24. 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
  • 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 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
  • 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 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
  • 29. 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>
  • 30. 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
  • 31. © 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
  • 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.