我有一个使用JAXB和Jersey的应用程序(使用MOXy作为JSON提供程序),需要序列化为JSON,其中java.util.Calendar
个对象转换为纪元值。到目前为止,我已经尝试过:
1)不执行任何允许默认转换:
@XmlAccessorType( XmlAccessType.FIELD )
public class Foo {
@XmlSchemaType( name = "dateTime" )
protected Calendar time;
public Calendar getTime() {
return time;
}
public void setTime( Calendar value ) {
this.time = value;
}
}
结果是ISO-8601:
{
"foo" : {
"time" : "2016-06-06T17:52:31.593-04:00"
}
}
2)使用适配器将其转换为long:
@XmlAccessorType( XmlAccessType.FIELD )
public class Foo {
@XmlJavaTypeAdapter( CalendarAdapter.class )
@XmlSchemaType( name = "dateTime" )
protected Calendar time;
public Calendar getTime() {
return time;
}
public void setTime( Calendar value ) {
this.time = value;
}
}
这导致了一个纪元价值,但是作为 STRING :
{
"foo" : {
"time" : "1465250094634"
}
}
3)2的变化:
@XmlAccessorType( XmlAccessType.FIELD )
public class Foo {
@XmlElement( type = String.class )
@XmlJavaTypeAdapter( CalendarAdapter.class )
@XmlSchemaType( name = "dateTime" )
protected Calendar time;
public Calendar getTime() {
return time;
}
public void setTime( Calendar value ) {
this.time = value;
}
}
在其中添加@XmlElement
以将类型设置为String
,这是使用xjc生成java pojo时获得的内容:
<xs:annotation>
<xs:appinfo>
<jaxb:globalBindings>
<xjc:javaType name="java.util.Calendar" xmlType="xs:dateTime"
adapter="org.mitre.caasd.ea.core.util.CalendarAdapter" />
</jaxb:globalBindings>
</xs:appinfo>
</xs:annotation>
这给了这个疯狂的JSON:
{
"foo" : {
"time" : {
"type" : "long",
"value" : 1465250270147
}
}
}
现在我不知道为什么会发生这种情况,也不知道为什么告诉元素它的类型是String
导致一个明显的非字符串值的行为,所以如果你可以解释这个奖励点。但是,我可以看到JSON如何提高清晰度,但是请求它的客户端却不理解它。我的客户在此替换服务之前很久就存在了,因此,我真的需要JSON看起来像这样:
{
"foo" : {
"time" : 1465250094634
}
}
我知道如何才能实现这一目标吗?
为了完整起见,我的CalendarAdapter实现是一个简单的解决方案:
public class CalendarAdapter extends XmlAdapter<Long, Calendar> {
@Override
public Calendar unmarshal( Long millis ) throws Exception {
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis( millis );
return calendar;
}
@Override
public Long marshal( Calendar calendar ) throws Exception {
return calendar.getTimeInMillis();
}
}
另外,我使用的是泽西版2.22.1。
----更新----
切换到Jackson而不是MOXy并使用适配器(在转换器上)按预期工作,所以现在我将使用这种方法。也许这应该被认为是MOXy中的一个错误?