2017-06-09 2 views
2

mit Gson würden Sie tun, um diesemit Moshi

Gson gson = new GsonBuilder() 
      .setDateFormat("yyyy-MM-dd'T'HH:mm") 
      .create(); 

und übergibt es an der Nachrüstung Builder und Gson würde ein Date-Objekt für Sie, Gibt es eine Möglichkeit zu bekommen Moshi dies auch in einer Kotlin Klasse zu tun?

+1

Wird https://github.com/square/moshi/tree/master/adapters/src/main/java/com/squadeup/moshi tun, was Sie wollen? Dieser Adapter wird im Moshi-Adapter-Artefakt veröffentlicht. –

Antwort

8

Wenn Sie möchten, dass ein Standard-ISO-8601 verwenden/RFC 3339 Datum Adapter (Sie wahrscheinlich tun), dann können Sie den eingebauten Adapter verwenden:

Moshi moshi = new Moshi.Builder() 
    .add(Date.class, new Rfc3339DateJsonAdapter().nullSafe()) 
    .build(); 

JsonAdapter<Date> dateAdapter = moshi.adapter(Date.class); 
assertThat(dateAdapter.fromJson("\"1985-04-12T23:20:50.52Z\"")) 
    .isEqualTo(newDate(1985, 4, 12, 23, 20, 50, 520, 0)); 

Sie finden diese Maven benötigen Abhängigkeit um das zu machen:

<dependency> 
    <groupId>com.squareup.moshi</groupId> 
    <artifactId>moshi-adapters</artifactId> 
    <version>1.5.0</version> 
</dependency> 

Wenn Sie ein benutzerdefiniertes Format verwenden möchten (Sie wahrscheinlich nicht), gibt es mehr Code. Schreiben Sie eine Methode, die ein Datum akzeptiert und formatiert es in eine Zeichenfolge und eine andere Methode, die eine Zeichenfolge akzeptiert und als Datum analysiert.

Object customDateAdapter = new Object() { 
    final DateFormat dateFormat; 
    { 
    dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm"); 
    dateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); 
    } 

    @ToJson synchronized String dateToJson(Date d) { 
    return dateFormat.format(d); 
    } 

    @FromJson synchronized Date dateToJson(String s) throws ParseException { 
    return dateFormat.parse(s); 
    } 
}; 

Moshi moshi = new Moshi.Builder() 
    .add(customDateAdapter) 
    .build(); 

JsonAdapter<Date> dateAdapter = moshi.adapter(Date.class); 
assertThat(dateAdapter.fromJson("\"1985-04-12T23:20\"")) 
    .isEqualTo(newDate(1985, 4, 12, 23, 20, 0, 0, 0)); 

Sie müssen sich daran erinnern synchronized weil SimpleDateFormat zu verwenden ist nicht Thread-sicher. Außerdem müssen Sie eine Zeitzone für die SimpleDateFormat konfigurieren.