编组时,Jettison / String以整数形式返回

时间:2014-03-13 12:44:34

标签: java json jettison

有一个Jettison的“功能”,在2008年以JIRA entry方式概述,其中涉及以下问题:

假设我要求“元素”的值为“00102”;输出可能如下所示:

{ "Response": 
    { "element": "00102" }
}

但现在我将“element”设置为“102”:

{ "Response":
    { "element": 102 }
}

我理解Jettison正试图提供帮助......但是说真的,我不需要它代表我来决定这种事情。无谢客。

目前的解决方法

目前,我使用了用户here概述的解决方案,他将以下内容添加到bean配置中:

<bean id="simpleConverter" class="org.codehaus.jettison.mapped.SimpleConverter"/>

<bean id="jsonProvider" class="org.apache.cxf.jaxrs.provider.JSONProvider">
    <property name="typeConverter" ref="simpleConverter"/>
</bean>

这部分地解决了这个问题,即使所有元素都被强制为字符串,即使它们是明显的整数。现在,至少,我确切地知道我的数据将保留什么结构,并且元素类型不会在不知情的情况下从字符串变为整数然后再返回。

问题

但是,我现在无法输出另一个元素作为整数,即使我现在希望这样做。似乎我只能强制元素的输出在整个服务中强制字符串,而不是基于每个元素。

除了'使用杰克逊'的建议(我不能遵循,因为框架明确使用Jettison)还有其他方法我可以指定哪些元素我想强制作为我的JSON输出中的字符串?

1 个答案:

答案 0 :(得分:1)

SimpleConverter也会将double和booleans转换为字符串,这是一个问题。

您只能为您的特殊用途覆盖默认转换器。数字。遗憾的是,无法查看要转换的原始字段的上下文

public class MyConverter extends org.codehaus.jettison.mapped.DefaultConverter {

    public Object convertToJSONPrimitive(String text) {
        Object primitive = super.convertToJSONPrimitive(text);

        //Apply your conversion rule;
        if (primitive != null 
                && primitive instanceof Long 
                && text.startsWith("0"))
            return text;
        else 
            return primitive;
    }
}

您可以看到DefaultConverter here

的完整代码

和CXF配置

<bean id="myConverter" class="MyConverter"/>

<bean id="jsonProvider" class="org.apache.cxf.jaxrs.provider.JSONProvider">
    <property name="typeConverter" ref="myConverter"/>
</bean>