【发布时间】:2020-05-23 16:02:39
【问题描述】:
我有一个 Json 编写器类 EntrenadorWriter,它将从 RestFul 服务生成的实体数据写入 Json 文件。然后,该文件被 Json 阅读器类使用。必须写入 Json 的字段之一是 Java.util.Date 日期。但是我在读写日期时遇到了严重的麻烦。
来自 Json writer 类的 WriteTo 方法:
@Override
public void writeTo(Usuario t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders,
OutputStream entityStream) throws IOException, WebApplicationException {
JsonGenerator gen = Json.createGenerator(entityStream);
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
gen.writeStartObject()
.write("Dni", t.getDni())
.write("PassWord", t.getPassWord())
.write("Login", t.getLogin())
.write("Email", t.getEmail())
.write("NombreCompleto", t.getNombreCompleto())
.write("Telefono", t.getTelefono())
.write("FechaNacimiento", df.format(t.getFechaNacimiento()))
.writeEnd();
gen.flush();
}
问题就从这里开始:
.write("FechaNacimiento", df.format(t.getFechaNacimiento()))
t.getFechaNacimiento() 返回一个java.util.Date,df.format() 将其解析为具有DateFormatter (yyyy-MM-dd) 中指定格式的字符串。
json 被写入并发送。
来自 Json 阅读器类的 ReadTo 方法:
public Usuario readFrom(Class<Usuario> type,
Type genericType,
Annotation[] annotations,
MediaType mediaType,
MultivaluedMap<String, String> httpHeaders,
InputStream entityStream)
throws IOException, WebApplicationException {
Usuario usuario = new Usuario();
JsonParser parser = Json.createParser(entityStream);
while (parser.hasNext()) {
switch (parser.next()) {
case KEY_NAME:
String key = parser.getString();
parser.next();
switch (key) {
case "Dni":
usuario.setDni(key);
break;
case "FechaNacimiento":
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate localDate = LocalDate.parse(key, formatter);
usuario.setFechaNacimiento(java.sql.Date.valueOf(localDate));
break;
default:
break;
}
break;
default:
break;
}
}
return usuario;
}
读取器使用 Json 中的日期字段并将字符串日期解析为 LocalDate 对象。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate localDate = LocalDate.parse(key, formatter);
我通过查看互联网进行了这种转换,我发现,为了解析具有“yyyy-MM-dd”格式的日期,没有时区部分,这种方式比使用更正确直接转换为日期对象。然后将 DateTime 对象解析为 java.sql.date java.sql.Date.valueOf(localDate)。
错误如下:
javax.ws.rs.client.ResponseProcessingException: javax.json.bind.JsonbException: Error parsing date from value: 1998-04-19
【问题讨论】:
-
下面这段代码适用于值 1998-04-19 : DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); LocalDate localDate = LocalDate.parse(key, formatter);这个异常是否可能发生在其他地方?要么是那个字符,要么是一个无效的字符,或者一个空格字符把它搞砸了。