【问题标题】:Error writing java.util.date into Json file将 java.util.date 写入 Json 文件时出错
【发布时间】: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.Datedf.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);这个异常是否可能发生在其他地方?要么是那个字符,要么是一个无效的字符,或者一个空格字符把它搞砸了。

标签: java json rest date


【解决方案1】:

如果key 已经是yyyy-MM-dd 格式,则不需要DateTimeFormatter 对象将其解析为LocalDate。你可以简单地这样做:

LocalDate localDate = LocalDate.parse(key);

另外,你为什么使用broken java.util.Date and outdated DateFormat

UsuariofechaNacimiento的类型改为LocalDate然后

case "FechaNacimiento": 
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    LocalDate localDate = LocalDate.parse(key, formatter);
    usuario.setFechaNacimiento(localDate); 
    break;

在里面,writeTo:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
...
...
...
.write("FechaNacimiento", formatter.format(t.getFechaNacimiento()))
.writeEnd();

【讨论】:

    猜你喜欢
    • 2019-08-13
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 2018-02-10
    相关资源
    最近更新 更多