From 752f4201c0c87de17323784f63727a167ae48372 Mon Sep 17 00:00:00 2001 From: mz0827 Date: Tue, 19 Nov 2013 23:11:51 +0800 Subject: [PATCH] add "extractValueFromSingleKeyModel" property to FastJsonJsonView just like "org.springframework.web.servlet.view.json.MappingJacksonJsonView" --- .../support/spring/FastJsonJsonView.java | 215 ++++++++++-------- 1 file changed, 115 insertions(+), 100 deletions(-) diff --git a/src/main/java/com/alibaba/fastjson/support/spring/FastJsonJsonView.java b/src/main/java/com/alibaba/fastjson/support/spring/FastJsonJsonView.java index 645e86b9a..283b9f318 100755 --- a/src/main/java/com/alibaba/fastjson/support/spring/FastJsonJsonView.java +++ b/src/main/java/com/alibaba/fastjson/support/spring/FastJsonJsonView.java @@ -1,5 +1,13 @@ package com.alibaba.fastjson.support.spring; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.serializer.SerializerFeature; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.servlet.view.AbstractView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.io.ByteArrayOutputStream; import java.io.OutputStream; import java.nio.charset.Charset; @@ -7,130 +15,137 @@ import java.util.HashMap; import java.util.Map; import java.util.Set; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.springframework.util.CollectionUtils; -import org.springframework.validation.BindingResult; -import org.springframework.web.servlet.view.AbstractView; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.serializer.SerializerFeature; - /** * @author libinsong1204@gmail.com */ public class FastJsonJsonView extends AbstractView { - public static final String DEFAULT_CONTENT_TYPE = "application/json"; + public static final String DEFAULT_CONTENT_TYPE = "application/json"; - public final static Charset UTF8 = Charset.forName("UTF-8"); + public final static Charset UTF8 = Charset.forName("UTF-8"); - private Charset charset = UTF8; + private Charset charset = UTF8; - private SerializerFeature[] serializerFeatures = new SerializerFeature[0]; + private SerializerFeature[] serializerFeatures = new SerializerFeature[0]; - private Set renderedAttributes; + private Set renderedAttributes; - private boolean disableCaching = true; + private boolean disableCaching = true; - private boolean updateContentLength = false; + private boolean updateContentLength = false; - public FastJsonJsonView(){ - setContentType(DEFAULT_CONTENT_TYPE); - setExposePathVariables(false); - } + private boolean extractValueFromSingleKeyModel = false; - public void setRenderedAttributes(Set renderedAttributes) { - this.renderedAttributes = renderedAttributes; - } + public FastJsonJsonView(){ + setContentType(DEFAULT_CONTENT_TYPE); + setExposePathVariables(false); + } - @Deprecated - public void setSerializerFeature(SerializerFeature... features) { - this.setFeatures(features); - } + public void setRenderedAttributes(Set renderedAttributes) { + this.renderedAttributes = renderedAttributes; + } - public Charset getCharset() { - return this.charset; - } + @Deprecated + public void setSerializerFeature(SerializerFeature... features) { + this.setFeatures(features); + } - public void setCharset(Charset charset) { - this.charset = charset; - } + public Charset getCharset() { + return this.charset; + } - public SerializerFeature[] getFeatures() { - return serializerFeatures; - } + public void setCharset(Charset charset) { + this.charset = charset; + } - public void setFeatures(SerializerFeature... features) { - this.serializerFeatures = features; - } + public SerializerFeature[] getFeatures() { + return serializerFeatures; + } - @Override - protected void renderMergedOutputModel(Map model, HttpServletRequest request, - HttpServletResponse response) throws Exception { - Object value = filterModel(model); + public void setFeatures(SerializerFeature... features) { + this.serializerFeatures = features; + } - String text = JSON.toJSONString(value, serializerFeatures); - byte[] bytes = text.getBytes(charset); + public boolean isExtractValueFromSingleKeyModel() { + return extractValueFromSingleKeyModel; + } - OutputStream stream = this.updateContentLength ? createTemporaryOutputStream() : response.getOutputStream(); - stream.write(bytes); + public void setExtractValueFromSingleKeyModel(boolean extractValueFromSingleKeyModel) { + this.extractValueFromSingleKeyModel = extractValueFromSingleKeyModel; + } - if (this.updateContentLength) { - writeToResponse(response, (ByteArrayOutputStream) stream); - } - } + @Override + protected void renderMergedOutputModel(Map model, HttpServletRequest request, + HttpServletResponse response) throws Exception { + Object value = filterModel(model); - @Override - protected void prepareResponse(HttpServletRequest request, HttpServletResponse response) { - setResponseContentType(request, response); - response.setCharacterEncoding(UTF8.name()); - if (this.disableCaching) { - response.addHeader("Pragma", "no-cache"); - response.addHeader("Cache-Control", "no-cache, no-store, max-age=0"); - response.addDateHeader("Expires", 1L); - } - } + String text = JSON.toJSONString(value, serializerFeatures); + byte[] bytes = text.getBytes(charset); - /** - * Disables caching of the generated JSON. - *

- * Default is {@code true}, which will prevent the client from caching the generated JSON. - */ - public void setDisableCaching(boolean disableCaching) { - this.disableCaching = disableCaching; - } + OutputStream stream = this.updateContentLength ? createTemporaryOutputStream() : response.getOutputStream(); + stream.write(bytes); - /** - * Whether to update the 'Content-Length' header of the response. When set to {@code true}, the response is buffered - * in order to determine the content length and set the 'Content-Length' header of the response. - *

- * The default setting is {@code false}. - */ - public void setUpdateContentLength(boolean updateContentLength) { - this.updateContentLength = updateContentLength; - } + if (this.updateContentLength) { + writeToResponse(response, (ByteArrayOutputStream) stream); + } + } - /** - * Filters out undesired attributes from the given model. The return value can be either another {@link Map}, or a - * single value object. - *

- * Default implementation removes {@link BindingResult} instances and entries not included in the - * {@link #setRenderedAttributes(Set) renderedAttributes} property. - * - * @param model the model, as passed on to {@link #renderMergedOutputModel} - * @return the object to be rendered - */ - protected Object filterModel(Map model) { - Map result = new HashMap(model.size()); - Set renderedAttributes = !CollectionUtils.isEmpty(this.renderedAttributes) ? this.renderedAttributes : model.keySet(); - for (Map.Entry entry : model.entrySet()) { - if (!(entry.getValue() instanceof BindingResult) && renderedAttributes.contains(entry.getKey())) { - result.put(entry.getKey(), entry.getValue()); - } - } - return result; - } + @Override + protected void prepareResponse(HttpServletRequest request, HttpServletResponse response) { + setResponseContentType(request, response); + response.setCharacterEncoding(UTF8.name()); + if (this.disableCaching) { + response.addHeader("Pragma", "no-cache"); + response.addHeader("Cache-Control", "no-cache, no-store, max-age=0"); + response.addDateHeader("Expires", 1L); + } + } -} + /** + * Disables caching of the generated JSON. + *

+ * Default is {@code true}, which will prevent the client from caching the generated JSON. + */ + public void setDisableCaching(boolean disableCaching) { + this.disableCaching = disableCaching; + } + + /** + * Whether to update the 'Content-Length' header of the response. When set to {@code true}, the response is buffered + * in order to determine the content length and set the 'Content-Length' header of the response. + *

+ * The default setting is {@code false}. + */ + public void setUpdateContentLength(boolean updateContentLength) { + this.updateContentLength = updateContentLength; + } + + /** + * Filters out undesired attributes from the given model. The return value can be either another {@link Map}, or a + * single value object. + *

+ * Default implementation removes {@link BindingResult} instances and entries not included in the + * {@link #setRenderedAttributes(Set) renderedAttributes} property. + * + * @param model the model, as passed on to {@link #renderMergedOutputModel} + * @return the object to be rendered + */ + protected Object filterModel(Map model) { + Map result = new HashMap(model.size()); + Set renderedAttributes = !CollectionUtils.isEmpty(this.renderedAttributes) ? this.renderedAttributes : model.keySet(); + for (Map.Entry entry : model.entrySet()) { + if (!(entry.getValue() instanceof BindingResult) && renderedAttributes.contains(entry.getKey())) { + result.put(entry.getKey(), entry.getValue()); + } + } + if(extractValueFromSingleKeyModel){ + if(result.size() == 1){ + for(Map.Entry entry : result.entrySet()){ + return entry.getValue(); + } + } + } + return result; + } + +} \ No newline at end of file