ホームページ >Java >&#&チュートリアル >Java8時のJSONデータを返すSpringMVCのフォーマット問題の解決方法を詳しく解説
この記事では、Java8 時の JSON データを返す SpringMVC の書式設定の問題を解決する方法を主に紹介します。編集者はそれが非常に優れていると考えたので、参考として共有します。エディターをフォローして見てみましょう
Spring MVCでJSON形式でレスポンスを返す際に@ResponseBodyアノテーションを使うことがありますが、java8での処理時は非常に面倒です。 通常、使用するHTTPMessageConverterはMappingJackson2HttpMessageConverterです。デフォルト 返される時刻形式は次のとおりです:
"startDate" : { "year" : 2010, "month" : "JANUARY", "dayOfMonth" : 1, "dayOfWeek" : "FRIDAY", "dayOfYear" : 1, "monthValue" : 1, "hour" : 2, "minute" : 2, "second" : 0, "nano" : 0, "chronology" : { "id" : "ISO", "calendarType" : "iso8601" } }
ただし、LocalDate に返したい形式は 2016-11-26 であり、フロントエンドで使用するためにこれを返しません。 LocalDateTime の場合は 2016 -11-26 21:04:34 のようなデータです。プロジェクトリサーチと関連情報のコンサルティングを通じて、それを個人リサーチに実装する 2 つの方法を次に示します。
解決策 1:
Maven プロジェクトの場合は、pom に次の jar パッケージを導入します:
<dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> <version>2.8.5</version> </dependency>
次に、JSON 化する POJO フィールドの get 関数に @ を追加しますJsonSerializer アノテーションは次のとおりです
import com.fasterxml.jackson.annotation.JsonFormat; @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") public LocalDateTime getBirthday() { return this.loginTime; } @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") public LocalDateTime getLastLoginTime() { return this.loginTime; }
このメソッドの利点は、特定のドメイン タイプに対して異なる表示方法を設定できることですが、各日付属性を手動で追加する必要があるため、利点は欠点でもあります。練習日属性は共通のEssentialであり、jsr310のjarパッケージを追加で導入する必要があります。
解決策 2:
ObjectMapper を継承して JSON 文字列を返します。 MappingJackson2HttpMessageConverter は主に ObjectMapper を使用して json 文字列を返します。ここでは、JsonUtil クラスを作成し、ObjectMapper を取得して、Java8 の新しい日付と時刻 API に対応する JsonSerializer8742468051c85b06f0a0af9e3e506b5c を登録します。
/** * json处理工具类 * * */ @Component public class JsonUtil { private static final ObjectMapper mapper; public ObjectMapper getMapper() { return mapper; } static { mapper = new ObjectMapper(); SimpleModule module = new SimpleModule(); module.addSerializer(LocalDate.class, new LocalDateSerializer()); module.addSerializer(LocalTime.class, new LocalTimeSerializer()); module.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer()); mapper.registerModule(module); } public static String toJson(Object obj) { try { return mapper.writeValueAsString(obj); } catch (Exception e) { throw new RuntimeException("转换json字符失败!"); } } public <T> T toObject(String json, Class<T> clazz) { try { return mapper.readValue(json, clazz); } catch (IOException e) { throw new RuntimeException("将json字符转换为对象时失败!"); } } } class LocalDateSerializer extends JsonSerializer<LocalDate> { private static final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); @Override public void serialize(LocalDate value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { jgen.writeString(dateFormatter.format(value)); } } class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> { private static final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); @Override public void serialize(LocalDateTime value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { jgen.writeString(dateTimeFormatter.format(value)); } } class LocalTimeSerializer extends JsonSerializer<LocalTime> { private static final DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss"); @Override public void serialize(LocalTime value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { jgen.writeString(timeFormatter.format(value)); } }
次に、springmvc 構成ファイルで f7ba1f27e11c63617ca69c495697dd74 を次の構成に変更し、新しい json コンバーターを構成し、その ObjectMapper オブジェクトを JsonUtil objectMapper オブジェクトのオブジェクトに設定します。コンバーターは Spring の組み込み JSON コンバーターよりも優先度が高いため、Spring は JSON 関連の変換に最初にそれを使用します。
<mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper" value="#{jsonUtil.mapper}" /> <property name="supportedMediaTypes"> <list> <value>application/json;charset=UTF-8</value> </list> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>
これで、Java8 のいくつかの日付と時刻の型が正常にわかりやすく表示されます。利点は日付や時刻などの型がグローバルかつ統一的に管理されることですが、欠点はPOJO内の特定のフィールドが特殊な処理を受けることです。
上記は、Java8 時間の JSON データを返す SpringMVC のフォーマットの問題を解決する方法の詳細な説明です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。