Spring MVC生成引用字段名称json输出

时间:2012-10-13 11:49:27

标签: java spring-mvc

我在我的webapplication中使用spring 3.0。我最近在我的应用程序中遇到了问题。我在spring-servlet.xml文件中使用<mvc:annotation-drive/>标记,但由于要求我要删除它并放置XML配置。

但现在我的问题是它生成带有引用字段名称的json输出,就像我返回Boolean.TRUE我在输出中得到"true"。我希望没有引号就是真的。

这是我的XML配置

<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" />
    <bean id="pathMatcher" class="net.hrms.web.filters.CaseInsensitivePathMatcher" />

<bean name="handlerAdapter" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="webBindingInitializer">
        <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
            <property name="conversionService" ref="conversionService"></property>
        </bean>
    </property>
    <property name="messageConverters">
        <list>
            <ref bean="byteArrayConverter"/>
            <ref bean="jaxbConverter"/>
            <ref bean="jsonHttpMessageConverter"/>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter"></bean>
            <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"></bean>
            <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"></bean>
            <bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"></bean>
        </list>
    </property>
</bean>
<bean name="byteArrayConverter" class="org.springframework.http.converter.ByteArrayHttpMessageConverter"></bean>
<bean name="jaxbConverter" class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"></bean>
<bean name="handlerMapping" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
    <property name="pathMatcher" ref="pathMatcher"></property>
</bean>

  <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsps/"/>
    <property name="suffix" value=".jsp"/>
  </bean>

  <bean id="jsonHttpMessageConverter"
        class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
    <property name="prefixJson" value="false"/>
    <property name="supportedMediaTypes" value="application/json"/>
  </bean>

任何帮助都会非常明显。

4 个答案:

答案 0 :(得分:0)

如果您使用的是FlexJSON插件,则可以为JSON创建自定义输出。我相信你也可以在杰克逊那里做到这一点,但我从来没有这样做过。 FlexJSON站点上有大量示例。

答案 1 :(得分:0)

如果仅返回true(或Boolean.TRUE.booleanValue()的原始值而不是Boolean.TRUE的包装对象版本,会发生什么?

答案 2 :(得分:0)

我相信在Jackson库中硬编码的是真值和假值(即使对于盒装布尔值也会调用writeBoolean):

private final static byte[] TRUE_BYTES = { 't', 'r', 'u', 'e' };

@Override
public void writeBoolean(boolean state)
    throws IOException, JsonGenerationException
{
    _verifyValueWrite("write boolean value");
    if ((_outputTail + 5) >= _outputEnd) {
        _flushBuffer();
    }
    byte[] keyword = state ? TRUE_BYTES : FALSE_BYTES;
    int len = keyword.length;
    System.arraycopy(keyword, 0, _outputBuffer, _outputTail, len);
    _outputTail += len;
}

所以杰克逊永远不会在字段值中返回双引号“true”(如果其行为没有严重覆盖,例如使用编解码器)。

因此,请检查是否正在调用MappingJacksonHttpMessageConverter方法,并且不会在其他位置执行转换。

答案 3 :(得分:0)

这是默认行为,如果您希望您的布尔值不加引号,请使用JAXB ContextResolver

像这样的东西

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;

import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
import javax.xml.bind.JAXBContext;

import com.sun.jersey.api.json.JSONJAXBContext;

@Provider
public class JAXBContextResolver implements ContextResolver<JAXBContext> {
     private JAXBContext context;
     private Class[] types = {SomeClass.class}; //Add the classes processed by JAXB and exposing boolean properties

     public JAXBContextResolver() throws Exception {
         Map props = new HashMap<String, Object>();
         props.put(JSONJAXBContext.JSON_NOTATION, JSONJAXBContext.JSONNotation.MAPPED);
         props.put(JSONJAXBContext.JSON_ROOT_UNWRAPPING, Boolean.TRUE);

     java.util.HashSet<String> eprops = new HashSet<String>();
         eprops.add("someBooleanProperty"); //add properties you want unquoted
         props.put(JSONJAXBContext.JSON_NON_STRINGS, eprops);
         this.context = new JSONJAXBContext(types, props);
     }

     public JAXBContext getContext(Class<?> objectType) {
         return (types[0].equals(objectType)) ? context : null;
     }
}