Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对自定义日期字符串使用Jackson JsonFormat模式_Java_Json_Jackson - Fatal编程技术网

Java 对自定义日期字符串使用Jackson JsonFormat模式

Java 对自定义日期字符串使用Jackson JsonFormat模式,java,json,jackson,Java,Json,Jackson,摘要 我试图解析日期,例如2017年9月25日,因此注释似乎是@JsonFormat(pattern=“dd/MMM/yy”)。然而,当我试图解析它时,我得到了一个InvalidFormatException,其本质是(下面的示例之后是完全异常): 我的日期格式字符串有什么问题?我看不出有什么问题。它看起来不像Sep与MMM配对 我使用的是Amazon Corretto Java版本“11.0.5”2019-10-15 LTS 复制示例 package example; import com.

摘要

我试图解析日期,例如2017年9月25日,因此注释似乎是
@JsonFormat(pattern=“dd/MMM/yy”)
。然而,当我试图解析它时,我得到了一个InvalidFormatException,其本质是(下面的示例之后是完全异常):

我的日期格式字符串有什么问题?我看不出有什么问题。它看起来不像
Sep
MMM
配对

我使用的是Amazon Corretto Java版本“11.0.5”2019-10-15 LTS

复制示例

package example;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;

import java.time.LocalDate;

public class HelloMapperApp {
  private static final ObjectMapper MAPPER = new ObjectMapper();

  public static void main(String[] args) {
    MAPPER.registerModule(new JavaTimeModule());
    try {
      Example example = MAPPER.readValue("{ \"name\": \"example\", \"date\": \"25/Sep/17\"", Example.class);
      System.out.println("Deserialised is: " + example);
    } catch (Exception e) {
      throw new RuntimeException("Could not parse JSON: " + e);
    }
  }

  static class Example {
    @JsonProperty
    String name;
    @JsonProperty
    @JsonFormat(pattern = "dd/MMM/yy")
    LocalDate date;

    @Override
    public String toString() {
      return String.format("name: %s%ndate: %s", name, date);
    }
  }
}

完全异常

Exception in thread "main" java.lang.RuntimeException: Could not parse JSON: com.fasterxml.jackson.databind.exc.InvalidFormatException: 
Cannot deserialize value of type 
`java.time.LocalDate` from String "25/Sep/17": Failed to deserialize java.time.LocalDate: 
(java.time.format.DateTimeParseException) Text '25/Sep/17' could not be parsed at index 3
 at [Source: (String)"{ "name": "example", "date": "25/Sep/17""; line: 1, column: 30] (through reference chain: example.HelloMapperApp$Example["date"])
        at example.HelloMapperApp.main(HelloMapperApp.java:19)

可能是给定输入的格式与格式化程序使用的区域设置不符。是一个类似的帖子,其中有人对
Sep
有问题,格式化程序希望
Sep.
用于
Locale.CANADA

您可以查看如何设置格式化程序的区域设置。例如:

@JsonFormat(locale=“en”,pattern=“dd/MMM/yy”)

仅供参考:您不需要将
LLL
作为文本使用数月。看一看

数字/文本:如果图案字母的计数为3或更多,请使用上述文本规则。否则,请使用上面的数字规则


当您使用
MMM
时,即三次
M
,格式化程序将隐式使用文本格式。

我刚刚用常用的
java.time
东西尝试了这一点,该模式适用于给定的输入。因为它适用于您,这给了我一个想法。我在Java8中尝试了上面的例子,效果很好。然而,在Java11中,它失败了,出现了上述错误。因此,它似乎是特定于Java11的。至少Corretto JDK 11不适用于上述示例。如果您有时间/兴趣,可以分享您尝试使用的Java版本吗?我使用了Java 11.0.3(Oracle)。我现在正在看。也许这是什么。试试
@JsonFormat(locale=“en”,shape=JsonFormat.shape.STRING,pattern=“dd/MMM/yy”)
。这样做很有效,在这种情况下,拥有
locale=“en”
可能是关键。我可以省去这个形状,只用
@JsonFormat(locale=“en”,pattern=“dd/MMM/yy”)
就可以了。先前的答案(删除后)建议使用
LLL
,因为它是本地日期。因此,在指定区域设置时,使用
dd/LLL/yy
也是有效的。请随意添加答案。
Exception in thread "main" java.lang.RuntimeException: Could not parse JSON: com.fasterxml.jackson.databind.exc.InvalidFormatException: 
Cannot deserialize value of type 
`java.time.LocalDate` from String "25/Sep/17": Failed to deserialize java.time.LocalDate: 
(java.time.format.DateTimeParseException) Text '25/Sep/17' could not be parsed at index 3
 at [Source: (String)"{ "name": "example", "date": "25/Sep/17""; line: 1, column: 30] (through reference chain: example.HelloMapperApp$Example["date"])
        at example.HelloMapperApp.main(HelloMapperApp.java:19)