使用 JAXB 映射使用 toString 的元素

Using JAXB to map elements using toString

我正在使用 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()。这可能吗?

诀窍是创建一个 XmlAdapter class 来帮助 Jaxb 转换一个 LocalDateTime 到字符串,然后从字符串返回到 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 时实例化编组(或取消编组),它将调用您的 XmlAdapater 的适当方法。

如果放在包裹层:

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

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

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

另请参阅此 link for more examples