SlideShare una empresa de Scribd logo
1 de 32
Descargar para leer sin conexión
© 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.

Más contenido relacionado

La actualidad más candente

Java Development with MongoDB
Java Development with MongoDBJava Development with MongoDB
Java Development with MongoDB
Scott Hernandez
 
Elasticsearch And Ruby [RuPy2012]
Elasticsearch And Ruby [RuPy2012]Elasticsearch And Ruby [RuPy2012]
Elasticsearch And Ruby [RuPy2012]
Karel Minarik
 

La actualidad más candente (20)

ElasticSearch for .NET Developers
ElasticSearch for .NET DevelopersElasticSearch for .NET Developers
ElasticSearch for .NET Developers
 
JSON
JSONJSON
JSON
 
Java script
Java scriptJava script
Java script
 
Basics of JSON (JavaScript Object Notation) with examples
Basics of JSON (JavaScript Object Notation) with examplesBasics of JSON (JavaScript Object Notation) with examples
Basics of JSON (JavaScript Object Notation) with examples
 
Ajax
AjaxAjax
Ajax
 
JSLT: JSON querying and transformation
JSLT: JSON querying and transformationJSLT: JSON querying and transformation
JSLT: JSON querying and transformation
 
JavaScript - From Birth To Closure
JavaScript - From Birth To ClosureJavaScript - From Birth To Closure
JavaScript - From Birth To Closure
 
JSON-(JavaScript Object Notation)
JSON-(JavaScript Object Notation)JSON-(JavaScript Object Notation)
JSON-(JavaScript Object Notation)
 
5 Tips for Better JavaScript
5 Tips for Better JavaScript5 Tips for Better JavaScript
5 Tips for Better JavaScript
 
JSON
JSONJSON
JSON
 
Json - ideal for data interchange
Json - ideal for data interchangeJson - ideal for data interchange
Json - ideal for data interchange
 
Reversing JavaScript
Reversing JavaScriptReversing JavaScript
Reversing JavaScript
 
Java Development with MongoDB
Java Development with MongoDBJava Development with MongoDB
Java Development with MongoDB
 
Data collection in AWS at Schibsted
Data collection in AWS at SchibstedData collection in AWS at Schibsted
Data collection in AWS at Schibsted
 
Elasticsearch And Ruby [RuPy2012]
Elasticsearch And Ruby [RuPy2012]Elasticsearch And Ruby [RuPy2012]
Elasticsearch And Ruby [RuPy2012]
 
Java and XML
Java and XMLJava and XML
Java and XML
 
Reactive Access to MongoDB from Scala
Reactive Access to MongoDB from ScalaReactive Access to MongoDB from Scala
Reactive Access to MongoDB from Scala
 
Elasticsearch (Rubyshift 2013)
Elasticsearch (Rubyshift 2013)Elasticsearch (Rubyshift 2013)
Elasticsearch (Rubyshift 2013)
 
A Re-Introduction to JavaScript
A Re-Introduction to JavaScriptA Re-Introduction to JavaScript
A Re-Introduction to JavaScript
 
Elasticsearch in 15 Minutes
Elasticsearch in 15 MinutesElasticsearch in 15 Minutes
Elasticsearch in 15 Minutes
 

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

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

Json generation
Json generationJson generation
Json generation
 
Ajax Tags Advanced
Ajax Tags AdvancedAjax Tags Advanced
Ajax Tags Advanced
 
Prototype-1
Prototype-1Prototype-1
Prototype-1
 
Prototype-1
Prototype-1Prototype-1
Prototype-1
 
15 expression-language
15 expression-language15 expression-language
15 expression-language
 
13 java beans
13 java beans13 java beans
13 java beans
 
Microsoft PowerPoint - &lt;b>jQuery&lt;/b>-1-Ajax.pptx
Microsoft PowerPoint - &lt;b>jQuery&lt;/b>-1-Ajax.pptxMicrosoft PowerPoint - &lt;b>jQuery&lt;/b>-1-Ajax.pptx
Microsoft PowerPoint - &lt;b>jQuery&lt;/b>-1-Ajax.pptx
 
jQuery-1-Ajax
jQuery-1-AjaxjQuery-1-Ajax
jQuery-1-Ajax
 
&lt;img src="../i/r_14.png" />
&lt;img src="../i/r_14.png" />&lt;img src="../i/r_14.png" />
&lt;img src="../i/r_14.png" />
 
jQuery-1-Ajax
jQuery-1-AjaxjQuery-1-Ajax
jQuery-1-Ajax
 
14 mvc
14 mvc14 mvc
14 mvc
 
02 servlet-basics
02 servlet-basics02 servlet-basics
02 servlet-basics
 
Ajax basics
Ajax basicsAjax basics
Ajax basics
 
java beans
java beansjava beans
java beans
 
10 jdbc
10 jdbc10 jdbc
10 jdbc
 
10 jdbc
10 jdbc10 jdbc
10 jdbc
 
Ajax Basics 1
Ajax Basics 1Ajax Basics 1
Ajax Basics 1
 
JavaScript-Core
JavaScript-CoreJavaScript-Core
JavaScript-Core
 
JavaScript-Core
JavaScript-CoreJavaScript-Core
JavaScript-Core
 
Java script core
Java script coreJava script core
Java script core
 

Último

CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
giselly40
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
Enterprise Knowledge
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 

Último (20)

Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 

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 hall@coreservlets.com 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.