当前位置: 首页 > 知识库问答 >
问题:

杰克逊将日期字符串反序列化为长

葛念
2023-03-14

Java Jackson能否将一个json字符串date反序列化成Java Long字段(从epoch开始的毫秒数)?

这是一个要反序列化的json字段的示例:

"timestamp": "2022-01-02T03:04:05Z",

这是Java类中的同一字段,带有当前注释:

@JsonFormat(shape = JsonFormat.Shape.NUMBER, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
@JsonProperty("timestamp") 
@JsonPropertyDescription("blah, blah\r\n")
public Long timestamp;

但是,发生异常

com . faster XML . Jackson . databind . exc . invalidformatexception:无法从字符串“2022-01-02T06:49:05Z”反序列化< code>java.lang.Long类型的值:不是有效的长整型值

有什么提示吗?谢谢。

共有2个答案

田焕
2023-03-14

使用自定义日期反序列化程序,如下所示:

public class CustomDateDeserializer extends StdDeserializer<Long> {

    private SimpleDateFormat formatter = 
      new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");

    public CustomDateDeserializer() {
        this(null);
    }

    public CustomDateDeserializer(Class<?> vc) {
        super(vc);
    }

    @Override
    public Long deserialize(JsonParser jsonparser, DeserializationContext context)  
      throws IOException, JsonProcessingException {
        String date = jsonparser.getText();
        try {
            return formatter.parse(date).toInstant().toEpochMilli();
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }
}

接下来用@JsonDeserialize(using=CustomDateDeserializer.class)注释字段。

@JsonDeserialize(using = CustomDateDeserializer.class)
public Long timestamp;
曹浩
2023-03-14

莫里斯的答案是正确的,它只会因为使用了众所周知的麻烦且过时已久的SimpleDateFormatDateclasses而受到影响。此外,如果没有它们,反序列化方法要简单得多:

public class LongTimestampDeserializer extends StdDeserializer<Long> {

    public LongTimestampDeserializer() {
        this(null);
    }

    public LongTimestampDeserializer(Class<?> vc) {
        super(vc);
    }

    /** @throws InvalidFormatException If the timestamp cannot be parsed as an Instant */
    @Override
    public Long deserialize(JsonParser parser, DeserializationContext ctxt)
            throws IOException {
        String timestamp = parser.getText();
        try {
            return Instant.parse(timestamp).toEpochMilli();
        }
        catch (DateTimeParseException dtpe) {
            throw new InvalidFormatException(
                    parser, dtpe.getMessage(), timestamp, Long.class);
        }
    }

}

根据我的理解,反序列化程序应该抛出一些 Json 处理异常的子类,以防解析错误。在这种情况下,无效格式异常是一个合适的子类。

 类似资料:
  • 问题内容: 我想将日期从Twitter反序列化为。我的程序在反序列化领域失败。 我的网域课程 我的解析方法 两项测试均失败,并出现java.time.ZonedDateTime 错误。 我已经检查了关于Stackoverflow的类似问题,我的格式看起来正确。 我做错了吗? 解决了 问题出在地区。添加确切的区域设置后,测试开始通过。 对于 用于测试 问题答案: 尝试在您的媒体资源上添加此注释

  • 我想将Twitter上的日期反序列化为。我的程序在<code>created_at</code>字段反序列化时失败。 我的域名类 我的解析方法 两个测试都失败,java.time.ZonedDateTime 类型的值。 我在Stackoverflow上检查了类似的问题,我的格式看起来是正确的。 我做错了? 解决 问题出在区域设置中。添加确切的区域设置后,测试开始通过。 对于<code>jackso

  • 问题内容: 我有一个这样的模型: 例如,我从远程获取以下JSON: 当我反序列化此JSON时,and 变量将获得正确的值。但是我不想解释我变量的内容。相反,我希望它是以下字符串: 之后,我将自己解释。我如何获得的价值? 问题答案: Jackson问题596是为原始问题中描述的所需功能而创建的。如果要实施它,请投票。 当前可用的解决方案是实现自定义反序列化处理。 另外,如何使用Jackson将原始J

  • 我正在调用一个返回JSON的endpoint,它看起来像这样(在Postman中): 此请求返回的Content-Type头是(与通常的 类来自外部库(编写这个endpoint的人)。无论如何,当我试图通过< code > rest template . exchange()调用这个endpoint时,Jackson都无法将这个JSON反序列化为一个有效的< code>Result类。我正在这样做

  • 问题内容: 我有一个有时看起来像这样的对象: 有时看起来像这样: 这些类如下所示: 第一种情况是第二种情况的简写。我想总是反序列化为第二种情况。 此外- 这是我们代码中非常常见的模式,因此我希望能够以通用方式进行序列化,因为与上述类似的其他类具有将String用作语法糖的相同模式。更复杂的对象。 我以为使用它的代码看起来像这样 如何编写可同时处理两种情况的自定义解串器(或其他模块)? 问题答案:

  • 我对jackson进行了配置,以便在和时给出一个简单的字符串表示。这可以在序列化过程中找到,例如,当我在REST API上获得数据时。 但反过来就不行了。当我试图将数据发送到服务器,并且应该将JSON解析为java对象时,会引发此异常: 很抱歉没有提到我在单元测试中。 TestClass: