ホームページ  >  記事  >  Java  >  Java8時のJSONデータを返すSpringMVCのフォーマット問題の解決方法を詳しく解説

Java8時のJSONデータを返すSpringMVCのフォーマット問題の解決方法を詳しく解説

黄舟
黄舟オリジナル
2017-03-07 10:03:082252ブラウズ

この記事では、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) に注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。