SpringMVC杂记(八) 使用阿里巴巴的fastjson
1) 国产开源软件要支持的
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.1.22</version></dependency>
2) spring没有提供相应的HttpMessageConverter可以自己写一个。
package com.alibaba.fastjson.spring.support;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.OutputStream;import java.nio.charset.Charset;import org.springframework.http.HttpInputMessage;import org.springframework.http.HttpOutputMessage;import org.springframework.http.MediaType;import org.springframework.http.converter.AbstractHttpMessageConverter;import org.springframework.http.converter.HttpMessageNotReadableException;import org.springframework.http.converter.HttpMessageNotWritableException;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.serializer.SerializerFeature;public class MappingFastJsonHttpMessageConverter extends AbstractHttpMessageConverter<Object> {public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");// fastjson特性参数private SerializerFeature[] serializerFeature;public SerializerFeature[] getSerializerFeature() {return serializerFeature;}public void setSerializerFeature(SerializerFeature[] serializerFeature) {this.serializerFeature = serializerFeature;}public MappingFastJsonHttpMessageConverter() {super(new MediaType("application", "json", DEFAULT_CHARSET));}@Overridepublic boolean canRead(Class<?> clazz, MediaType mediaType) {// JavaType javaType = getJavaType(clazz);// return this.objectMapper.canDeserialize(javaType) &&// canRead(mediaType);return true;}@Overridepublic boolean canWrite(Class<?> clazz, MediaType mediaType) {// return this.objectMapper.canSerialize(clazz) && canWrite(mediaType);return true;}@Overrideprotected boolean supports(Class<?> clazz) {// should not be called, since we override canRead/Write insteadthrow new UnsupportedOperationException();}@Overrideprotected Object readInternal(Class<?> clazz, HttpInputMessage inputMessage)throws IOException, HttpMessageNotReadableException {ByteArrayOutputStream baos = new ByteArrayOutputStream();int i;while ((i = inputMessage.getBody().read()) != -1) {baos.write(i);}return JSON.parseArray(baos.toString(), clazz);}@Overrideprotected void writeInternal(Object o, HttpOutputMessage outputMessage)throws IOException, HttpMessageNotWritableException {String jsonString = JSON.toJSONString(o, serializerFeature);OutputStream out = outputMessage.getBody();out.write(jsonString.getBytes(DEFAULT_CHARSET));out.flush();}}
3) 配置
<bean value="application/json" /><property name="serializerFeature"><array><value>WriteMapNullValue</value><value>QuoteFieldNames</value></array></property></bean>
另外我想问下,返回的JSON在前端页面是怎样绑定, 用datalink? 有没有例子。 4 楼 yingzhor 2012-08-16 一般只有使用到ajax技术的时候才通过后端返回json对象。
在前端json对象就是一个javascript对象。 直接取其属性即可。