使用JAXB使用toString映射元素

时间:2015-01-21 13:37:18

标签: java json jaxb

我正在使用JAXB将类映射到JSON(使用genson)。我想将某些类型嵌入到简单的字符串中,例如:

@XmlRootElement

class Request {
    private LocalDateTime receivedAt;
}

映射到

{  
   "receivedAt":{  
      "dayOfMonth":21,
      "dayOfWeek":"WEDNESDAY",
      "dayOfYear":21,
      "hour":12,
      "minute":33,
      "month":"JANUARY",
      "monthValue":1,
      "nano":110000000,
      "second":51,
      "year":2015
   }
}

我希望看起来像

{  
   "receivedAt":"2015-01-21T12:33:51+00:00"
}

即。在条目值上使用toString()。这可能吗?

1 个答案:

答案 0 :(得分:1)

诀窍是创建一个XmlAdapter类来帮助Jaxb转换a LocalDateTime到String并从String返回到LocalDateTime。

这样的事情:

public class LocalDateTimeXmlAdapter extends XmlAdapter<String, LocalDateTime> {
    @Override
    public String marshal(LocalDateTime arg0) throws Exception {
        return arg0.toString();
    }

    @Override
    public LocalDateTime unmarshal(String arg0) throws Exception {
        return new LocalDateTime(arg0);
    }
}

然后,使用@XmlJavaTypeAdapter注释您的字段或注释整个包(如果您希望将其应用于任何序列化的LocalDateTime字段),以便JaxB实例化您的XmlAdapter以及每当它找到LocaleDateTime进行编组时(或unmarshal),它将调用XmlAdapater的相应方法。

如果你加入包级别:

@XmlJavaTypeAdapters(
        @XmlJavaTypeAdapter(type=LocalDateTime.class, value=LocalDateTimeXmlAdapter.class)
        )

如果你把它放在你的领域:

@XmlJavaTypeAdapter(value=LocalDateTimeXmlAdapter.class)
private LocalDateTime receivedAt;

另见link for more examples