Hello,

In this mini article, we will explain the 2 ways to generate JSON from a web application based on Spring MVC:
– with the “JSON view resolver” of Spring;
– without the “JSON view resolver” of Spring i.e. with the json-lib-2.3-jdk15.jar;

Reminder: Classic handler returning to a JSP page due to ‘JstlView’

 
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
	
<!-- .... -->

	<!-- ################### SPRING MVC VIEW RESOLVER  ################### -->
	<!-- 
		IF the Controller returns a logical view name="myList" THEN 
			the ViewResolver will return the file "/WEB-INF/jsp/myList.jsp"
		END IF
	 -->
	<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
		<property name="prefix" value="/WEB-INF/jsp/"></property>
		<property name="suffix" value=".jsp"></property>
  		<property name="order"><value>2</value></property>
	</bean>
<!-- .... -->

</beans>

… and the view resolver JstlView is used in the spring controller like:

/**
 * Controler SPRING MVC: Class to handle the web requests.
 * 
 * @author HOZVEREN
 * 
 */
public class MyController extends MultiActionController {
//...
	/**
	 * <p> Handler of Spring controller using the Spring Internal Resource view resolver</p>
	 */
	public ModelAndView handleWithSpringSpringInternalResourceResolver(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException, InterruptedException {
		Object bean = null; // .... 
		//Store the data in request's attribute
		request.setAttribute("ControllerData", data);
		
		// Return the view name (to internal resolver)
		return new ModelAndView("/myJSPPage");
	}
//...
}

JSON with the “JSON view resolver” of Spring
Often the web applications based on Spring MVC, use the “JSON view resolver” of Spring:

 
<!-- .... -->
	<!-- ################### SPRING JSON RESOLVER ################### -->
	<bean id="jsonResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver">
		<property name="order"><value>1</value></property>
	</bean>

	<bean name="jsonView" class="org.springframework.web.servlet.view.json.JsonView">
		<property name="contentType">
			<value>text/html</value>
		</property>
	</bean>
<!-- .... -->

</beans>

… and the view resolver JsonView is used in the spring controller like:

//...
	/**
	 * <p> Handler of Spring controller using the Spring JSON resolver</p>
	 */
	public ModelAndView handleWithSpringJsonResolver(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException, InterruptedException {
		Object bean = null; // .... 
		Map<String, Object> model = new HashMap<String, Object>();
		model.put("success", "true");
		model.put("data", bean);
		return new ModelAndView("jsonView", model);
	}

//...

JSON without the “JSON view resolver” of Spring
It is possible to use an external library like json-lib-2.3-jdk15.jar to generate “manually” the JSON instead of the Spring json resolver. So, it is not necessary to configure a ViewResolver in spring web context.

First, we wil create a class ListOfDocuments containing a number of Document:

public class ListOfDocuments{
//...
	// Convert and return the JSON object of current object
	public JSONObject getJSON(){
		JSONObject jsonObj = new JSONObject();
		JSONArray jsonArray = new JSONArray();
		for(Document doc : this.documents){
			jsonArray.add(doc.getJSON());
		}
		jsonObj.put("listId", this.listId);
		jsonObj.put("items", jsonArray);
		return jsonObj;
	}
//...
}
public class Document{
//...
	// Convert and return the JSON object of current object
	public JSONObject getJSON(){
		JSONObject jsonObj = new JSONObject();
		jsonObj.put("documentId", this.documentId);
		jsonObj.put("reference", this.reference);
		return jsonObj;
	}
//...
}

… then, the spring controller could generate the JSON by directly calls the appropriate methods:

//...
	/**
	 * <p> Handler of Spring controller using the external JSON generator json-lib-2.3-jdk15.jar</p>
	 */
	public ModelAndView handleWithExternalJSONGenerator(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException, InterruptedException {
		ListOfDocuments bean = null; // .... 
		//
		{
			reponse.setContentType("application/json");
			obj.write(reponse.getWriter());
			
		}
		return null;
	}
//...

More, it is possible to write a JSON Configuration to specify the behaviour during the jsonization:

private static JsonConfig jsonConfigValidation;
{
	jsonConfigValidation = getDefaultJsonConfig();
	jsonConfigValidation.setExcludes(new String[]{"errorPresent"});	
}

// Generic jsonConfig
private JsonConfig getDefaultJsonConfig(){
	JsonConfig config = new JsonConfig();
	config.registerJsonValueProcessor(Calendar.class, new JsonValueProcessor(){
		@Override
		public Object processArrayValue(Object value, JsonConfig config){
			return process(value, config);
		}
			
		@Override
		public Object processObjectValue(String key, Object value, JsonConfig config){
			return process(value, config);
		}
		
		private Object process(Object value, JsonConfig config){
			String txtValue = "12/12/2012"; // txt value of calendar object
		}
		
	});
	return config;
}

This JsonConfig could be used during the creation of JsonObjectlike:

JSONObject jsonObj = new JSONObject();
jsonObj.put("errors", JSONArray.fromObject(errors, jsonConfigValidation));

That’s all !!!!

Huseyin OZVEREN