至少有两种方法可以做到这一点:
1) 带有 JsonDeserializer 的 Gson
代码中的小改动:
Type listType = new TypeToken<List<Scorefactor>>() {}.getType();
List<Scorefactor> scorefactors = new GsonBuilder()
.registerTypeAdapter(ZonedDateTime.class, GsonHelper.ZDT_DESERIALIZER)
.create()
.fromJson(output, listType);
助手类
class GsonHelper {
public static final JsonDeserializer<ZonedDateTime> ZDT_DESERIALIZER = new JsonDeserializer<ZonedDateTime>() {
@Override
public ZonedDateTime deserialize(final JsonElement json, final Type typeOfT, final JsonDeserializationContext context) throws JsonParseException {
JsonPrimitive jsonPrimitive = json.getAsJsonPrimitive();
try {
// if provided as String - '2011-12-03T10:15:30+01:00[Europe/Paris]'
if(jsonPrimitive.isString()){
return ZonedDateTime.parse(jsonPrimitive.getAsString(), DateTimeFormatter.ISO_ZONED_DATE_TIME);
}
// if provided as Long
if(jsonPrimitive.isNumber()){
return ZonedDateTime.ofInstant(Instant.ofEpochMilli(jsonPrimitive.getAsLong()), ZoneId.systemDefault());
}
} catch(RuntimeException e){
throw new JsonParseException("Unable to parse ZonedDateTime", e);
}
throw new JsonParseException("Unable to parse ZonedDateTime");
}
};
}
2) 使用 MessageBodyReader & XMLAdapter
您的客户端实施的更改:
ClientConfig config = new DefaultClientConfig();
config.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
Client client = Client.create(config);
List<Scorefactor> result = client.resource("http://localhost:8080/adap/api/getScoreFactor"")
.accept("application/json")
.get(ClientResponse.class)
.getEntity(new GenericType<List<Scorefactor>>(){});
System.out.println(result);
您可能需要为此导入 jersey-json
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-bundle</artifactId>
<version>1.19.1</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>1.19.1</version>
</dependency>
顺便说一句,你为什么使用 1.*?
你的得分因素
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Scorefactor implements Serializable {
@Column(name = "lastmodifieddate")
@XmlElement(name = "lastmodifieddate")
@XmlJavaTypeAdapter(ZonedDateTimeToStringXmlAdapter.class)
private ZonedDateTime lastmodifieddate;
//...
ZonedDateTime 从/到字符串(推荐)
public class ZonedDateTimeToStringXmlAdapter extends XmlAdapter<String, ZonedDateTime> {
@Override
public ZonedDateTime unmarshal(final String v) throws DateTimeParseException {
return ZonedDateTime.parse(v);
}
@Override
public String marshal(final ZonedDateTime v) throws Exception {
return v.toString();
}
}
ZonedDateTime 从 / 到 Long
public class ZonedDateTimeToLongXmlAdapter extends XmlAdapter<Long, ZonedDateTime> {
@Override
public ZonedDateTime unmarshal(final Long v) throws DateTimeParseException {
return ZonedDateTime.ofInstant(Instant.ofEpochMilli(v.longValue()), ZoneId.systemDefault());
}
@Override
public Long marshal(final ZonedDateTime v) throws Exception {
return Long.valueOf(v.toInstant().toEpochMilli());
}
}
您还可以构建自己的 MessageBodyReader/MessageBodyWriter 或使用 Moxy 等其他实现。
我想推荐使用 Jersey 2.*。
希望这对您有所帮助。祝你今天过得愉快。