早在2008年,JIRA条目中就概述了Jettison的“功能”,它指的是以下问题:
假设我要求“元素”的值为“00102”;输出可能如下所示:
{ "Response":
{ "element": "00102" }
}
但现在我将“元素”设置为“102”:
{ "Response":
{ "element": 102 }
}
我知道杰蒂森想帮忙…但说真的,我不需要它来代表我决定这种事情。不,谢谢。
当前的工作方法
目前,我使用了这里用户概述的解决方案,他将以下内容添加到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>
这在一定程度上解决了这个问题,也就是说所有元素都被迫是字符串,即使它们显然是整数。现在,至少,我确切地知道我的数据将包含什么结构,并且元素类型不会在我不知情的情况下从字符串变为整数,然后又变回来。
问题
但是,我现在无法将另一个元素输出为整数,即使我现在希望这样做。似乎我只能强制元素的输出在整个服务中串起来,而不是在每个元素的基础上。
除了使用Jackson的建议(我无法遵循,因为框架明确使用了Jettison),还有其他方法可以指定我想在JSON输出中强制作为字符串的元素吗?
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的完整代码
和CXF配置
<bean id="myConverter" class="MyConverter"/>
<bean id="jsonProvider" class="org.apache.cxf.jaxrs.provider.JSONProvider">
<property name="typeConverter" ref="myConverter"/>
</bean>