`

在spring中配置json格式的输入与输出

阅读更多

        现今的项目,有很多会用到json的输入输出,如手机终端、网页ajax异步请求等。下面是我自己遇到在java项目中较好的使用json输入输出的方式

 

一、给spring配置输入输出json的支持

    1. 引入jackson的包

          jackson-core-asl-1.9.13.jar
          jackson-mapper-asl-1.9.13.jar
          jackson-core-lgpl-1.9.13.jar
          jackson-mapper-lgpl-1.9.13.jar

      在此提供maven配置:

		<dependency>
			<groupId>org.codehaus.jackson</groupId>
			<artifactId>jackson-core-asl</artifactId>
			<version>1.9.13</version>
			<type>jar</type>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>org.codehaus.jackson</groupId>
			<artifactId>jackson-mapper-asl</artifactId>
			<version>1.9.13</version>
			<type>jar</type>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>org.codehaus.jackson</groupId>
			<artifactId>jackson-core-lgpl</artifactId>
			<version>1.9.13</version>
			<type>jar</type>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>org.codehaus.jackson</groupId>
			<artifactId>jackson-mapper-lgpl</artifactId>
			<version>1.9.13</version>
			<type>jar</type>
			<scope>compile</scope>
		</dependency>

 

 

     2.在spring配置文件中加入

	<bean class ="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" >
    	<property name="messageConverters">
 		<list>
   			<ref bean="mappingJacksonHttpMessageConverter" /><!-- json转换器 -->
  		</list>
		</property>
	</bean>
	<bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" >
	</bean>

 

     3.在使用要输入输出的controller方法加上@RequestBody 和 @ResponseBody

//JsonRequest和JsonResponse是自定义的请求与返回实体
public @ResponseBody JsonResponse process(@RequestBody JsonRequest request) {
	return new JsonResponse();
}

 

   JsonResponse.java

public class Response implements Serializable {
    private static final long serialVersionUID = 7015731184314121850L;
    private String cmd;
    private String token;
    public String getCmd() {
        return cmd;
    }

    public void setCmd(String cmd) {
        this.cmd = cmd;
    }

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }
}

 

 

   JsonRequest.java

public class JsonRequest {
    String cmd;
    String cmdtype;
    
    public String getCmd() {
        return cmd;
    }

    public void setCmd(String cmd) {
        this.cmd = cmd;
    }

    public String getCmdtype() {
        return cmdtype;
    }

    public  void setCmdtype(String cmdtype) {
        this.cmdtype = cmdtype;
    }

}

 

 

    至此,简单javaBean自动序列化为json字符串的配置就完成了。

    测试举例

    header

{"Content-Type":"application/json"}

 

 

    json请求   

{
	"cmd":"get msg", 
	"cmdtype":""
}

 

 

    json返回 

{
	"cmd": "get msg",
	"token": ""
}

 

 

    

 

二、利用jackson的多态,spring自动识别子类

     我们还会遇到很多包含有类成员变量的复杂实体,如JsonRequest里有Data自定义类变量,那该如何转换?

      JsonRequest.java 

public class Request {
    String cmd;
    String cmdtype;
    Data data; // data支持的类型:基本数据类型及对应包装类,Collection、Map的实现类,JavaBean
    public String getCmd() {
        return cmd;
    }

    public void setCmd(String cmd) {
        this.cmd = cmd;
    }

    public String getCmdtype() {
        return cmdtype;
    }

    public  void setCmdtype(String cmdtype) {
        this.cmdtype = cmdtype;
    }

    public Data getData() {
        return data;
    }

    public void setData(Data data) {
        this.data = data;
    }
}

 

    1. jackson的多态   

Jackson数据绑定可以很方便的将java的对象类型和json数据格式之间进行转换。对于有多个子类型的多态集成结构的对象,Jackson在序列化的时候加入一些类型信息,可以在反序列化的时候准确的还原某个类型的子类。

 

    方式一

objectMapper.enableDefaultTyping(); // default to using DefaultTyping.OBJECT_AND_NON_CONCRETE
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

    

DefaultTyping 有四个选项
JAVA_LANG_OBJECT:  当对象属性类型为Object时生效
OBJECT_AND_NON_CONCRETE:  当对象属性类型为Object或者非具体类型(抽象类和接口)时生效
NON_CONCRETE_AND+_ARRAYS:  同上, 另外所有的数组元素的类型都是非具体类型或者对象类型
NON_FINAL:  对所有非final类型或者非final类型元素的数组
开启DefaultTyping,并且让所有的非final类型对象持久化时都存储类型信息显然能准确的反序列多态类型的数据。

 

 

    方式二

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@class")
class Animal { }

 

use=JsonTypeInfo.Id.CLASS:  使用类的完全限定名作为唯一识别
include=JsonTypeInfo.As.PROPERTY:  将这个唯一识别的字段保存为属性值
property="@class"  该属性值的名称为 @class
use的几个可选值
CLASS 完全限定名
MINIMAL_CLASS 类名,若基类和子类在同一包类,会省略包名
NAME 逻辑名,需要单独定义名称与类的对应关系
CUSTOM 由@JsonTypeIdResolver对应
include的几个选值
PROPERTY 将属性包含在对象成员属性里
WRAPPER_OBJECT 属性作为键,序列化的对象作为值
WRAPPER_ARRAY 第一个元素是类型ID,第二原始是序列化的对象

 

    参考链接:http://codelife.me/blog/2012/11/03/jackson-polymorphic-deserialization/

 

 

    2.为Class添加@JsonTypeInfo

     我所见过的是使用方式二@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@class")

 

    Data接口 Data.java      

//以下注解含义:如何从Json中辨认Data的实现类?通过Json对象中的"dt"字段来辨别,通过其值找到对应的实现类。
@JsonTypeInfo(include = As.PROPERTY, property = "dt", use = Id.NAME)
public interface Data extends Serializable {
}

 

 

    名为data_impl的Data接口其中一个实现类 DataImpl.java 

@JsonTypeName("data_impl")
public class DataImpl implements Data{
	private static final long serialVersionUID = 6904642231937403932L;
	private String name;
	private Integer value;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getValue() {
		return value;
	}
	public void setValue(Integer value) {
		this.value = value;
	}
}

 

 

 

    3. Spring 中 BeanPostProcessor接口的介绍

public interface BeanPostProcessor {

	Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;

	Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;

}

     BeanPostProcessor是spring对bean实体预处理的接口,实现了BeanPostProcessor接口的类被注入给spring管理后,会自动在加载实体前后调用其方法。

     由于Spring3.0与Spring3.1版本有不同,所以结合完jackson的处理略有不同,否则,有子类的json串将报具体代码如下:

     

@Component
public class JsonObjectMapperConfiguration implements BeanPostProcessor {

    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

    @SuppressWarnings("deprecation")
	public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    	//spring 3.1以上
        if (bean instanceof RequestMappingHandlerAdapter) {
        	RequestMappingHandlerAdapter adapter = (RequestMappingHandlerAdapter) bean;
        	List<HttpMessageConverter<?>> converters = adapter.getMessageConverters();
            for (HttpMessageConverter<?> converter : converters) {
                if (converter instanceof MappingJacksonHttpMessageConverter) {
                    MappingJacksonHttpMessageConverter jsonConverter = (MappingJacksonHttpMessageConverter) converter;
                    ObjectMapper mapper = new ObjectMapper();
                    mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, true);
                    SerializationConfig config = mapper.getSerializationConfig();
                    config.setSerializationInclusion(Inclusion.NON_NULL);
                    mapper.registerSubtypes(DataImpl.class);
                    jsonConverter.setObjectMapper(mapper);
                }
            }
        }
    	
        /* sping3.0
        if (bean instanceof AnnotationMethodHandlerAdapter) {
            AnnotationMethodHandlerAdapter adapter = (AnnotationMethodHandlerAdapter) bean;
            HttpMessageConverter<?>[] converters = adapter.getMessageConverters();
            for (HttpMessageConverter<?> converter : converters) {
                if (converter instanceof MappingJacksonHttpMessageConverter) {
                    MappingJacksonHttpMessageConverter jsonConverter = (MappingJacksonHttpMessageConverter) converter;
                    ObjectMapper mapper = new ObjectMapper();
                    mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, true);
                    SerializationConfig config = mapper.getSerializationConfig();
                    config.setSerializationInclusion(Inclusion.NON_NULL);
                    mapper.registerSubtypes(DataImpl.class);
                    jsonConverter.setObjectMapper(mapper);
                }
            }
        }
        */
        return bean;
    }
}

 

 

    现在就可以在请求的json里加入带Data的类成员变量参数了

    请求加入data后

{
  "cmd": "get msg",
  "cmdtype": "",
  "data": {
    "dt": "data_impl",
    "name": "ok",
    "value": 2
  }
}

    返回也可加入data

{
	"cmd": "12323",
	"token": "ok=2",
	"data": {
		"dt": "data_result",
		"name": "okasdf"
	}
}

 

 

三、总结

     以上就是要达到想要的效果,可以使用dt定义接口数据类型,cmd定义api名称。

 

分享到:
评论

相关推荐

    Spring MVC 学习笔记 九 json格式的输入和输出

    在这个学习笔记中,我们将深入探讨如何在Spring MVC中处理JSON格式的数据,包括输入和输出。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛应用于前后端数据传输。 1. **JSON格式简介** ...

    Spring MVC学习笔记之json格式的输入和输出

    在Spring MVC框架中,处理JSON格式的输入输出是开发RESTful服务的重要一环。JSON(JavaScript Object Notation)因其轻量级和良好的跨平台兼容性而被广泛使用。Spring MVC提供了灵活的方式来处理JSON数据的输入和...

    jack-json包和配置,springmvc3.2及以下json格式支持

    3. **处理Controller**: 在Controller中,我们可以使用`@RequestBody`和`@ResponseBody`注解来指定输入和输出的数据应使用JSON格式。例如: ```java @RequestMapping(value = "/example", method = RequestMethod....

    用Spring MVC 搭建JSON 数据服务器

    在这个过程中,我们将学习如何使用 Spring MVC 来创建一个返回 JSON 格式数据的服务器,以及如何在 Android 应用中消费这些数据。 ### 第一部分:环境准备 1. **Eclipse Neon**:这是一个集成开发环境,用于编写 ...

    spring web 4.1处理json

    然后,在Spring配置中,我们可以声明`MappingJackson2HttpMessageConverter`,这会自动处理JSON数据的输入和输出。 2. **模型类注解**: 对于Java对象到JSON的转换,我们可以在模型类上使用Jackson提供的注解,如...

    java服务端生成json(json服务端)

    在浏览器中,你可以直接输入URL,如`http://yourserver.com/user`,如果服务端配置正确,浏览器将会以纯文本形式显示JSON数据。 总结来说,Java服务端生成JSON涉及的主要知识点包括: 1. JSON数据格式的理解及其在...

    springmvc json jar包

    它包括JSON流API,用于处理JSON输入和输出,如JsonParser和JsonGenerator。 - **jackson-mapper-asl**:这个模块是基于核心模块构建的,提供了一个对象映射框架,使得Java对象可以被自动转换为JSON,反之亦然。它...

    springmvc加入json支持需要的jar包

    这个模块包含了处理JSON流的类,如`JsonParser`和`JsonGenerator`,它们分别用于解析JSON输入和生成JSON输出。 3. `jackson-databind-2.4.2.jar`:此jar包是Jackson最核心的部分,提供了基于Java Bean属性的映射...

    ssh整合中的jsonjar包

    总之,"ssh整合中的jsonjar包"涉及的是如何在SSH框架下利用JSON进行数据交换的技术,这包括选择合适的JSON库,配置SSH框架支持JSON,以及处理数据的序列化和反序列化等环节。通过熟练掌握这些知识点,开发者能够有效...

    ApacheCxf提供Json格式接口服务demo

    在Spring配置文件中,你需要定义一个`jaxrs:server`元素,指定服务的基础地址和实现类。例如: ```xml &lt;jaxrs:server id="jsonService" address="/jsonservice"&gt; ``` 其中,`...

    Spring MVC 数据转换和格式化.docx

    在Spring MVC框架中,数据转换和格式化是一个关键部分,它允许我们处理各种类型的输入和输出数据,确保数据能够在客户端和服务器之间正确地传递。HttpMessageConverter是Spring MVC中的核心组件,负责处理HTTP请求和...

    springmvc-json_v2.zip

    在这个名为"springmvc-json_v2.zip"的压缩包中,我们可以推测它包含了一组与Spring MVC框架和JSON处理相关的示例或者项目配置。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于前后端数据...

    SSh框架所需json jar包

    这些jar包是SSH框架能够正确处理JSON输入和输出的关键,如果没有它们,SSH框架在尝试解析或生成JSON时可能会出现错误。 在SSH框架中,常用的JSON库有Jackson、Gson、Fastjson等。这些库提供了将Java对象转换为JSON...

    SringMVC的经典例子(集成日志、json解析功能)

    - **配置Jackson**:添加Jackson依赖库到项目中,并在Spring配置文件中启用JSON支持。 - **控制器处理JSON**:Controller方法的输入参数可以是@RequestBody注解的Java对象,Spring MVC会自动使用Jackson将其从JSON...

    SpringMVC JSON数据交互及RESTful支持实现方法

    在SpringMVC中,对于JSON的输入和输出,开发者通常会使用两个重要的注解:@RequestBody和@ResponseBody。@RequestBody注解用于将请求体中的JSON数据绑定到控制器方法的参数上;@ResponseBody注解则用于将控制器方法...

    json解析利器-jackson

    此外,Jackson还与其他工具和框架,如Spring、Hibernate等有很好的集成,使得在大型项目中使用更加便捷。 总之,Jackson是Java开发中处理JSON不可或缺的工具,无论是在简单的数据交换还是复杂的序列化场景下,都能...

    使用json的jar包

    例如,在Spring MVC中,可以通过配置`@ResponseBody`注解,让控制器方法返回的Java对象自动转换为JSON响应: ```java import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web...

    springcloud-stream-demo-master.zip

    3. 消息转换(Message Conversion):SpringCloud Stream支持多种消息格式,包括JSON、XML等,并提供了自动的消息转换机制,确保消息在发送和接收之间的一致性。 四、实战应用 1. 创建Stream:在Spring Cloud ...

    struts json ajax action 结合

    首先,我们需要在Struts.xml配置文件中启用JSON插件,并指定哪些Action支持JSON输出。接着,我们在Action类中处理业务逻辑,然后返回一个包含所需数据的Java对象。该对象将自动被转换为JSON格式,并响应到客户端。 ...

Global site tag (gtag.js) - Google Analytics