是否可以使用MOXy将Calendar值封送为JSON格式的纪元?

时间:2016-06-06 22:09:39

标签: java json jaxb jersey moxy

我有一个使用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中的一个错误?

0 个答案:

没有答案