Ein Hinweis zur Problemumgehung, da die Annotation `` `@ JSONHint``` bei Verwendung von JSONIC und lombok nicht gut funktioniert hat.
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
</dependency>
<dependency>
<groupId>net.arnx</groupId>
<artifactId>jsonic</artifactId>
<version>1.3.10</version>
</dependency>
Angenommen, Sie möchten einen JSON, der eine Datumszeichenfolge im folgenden Format enthält, als Beispiel analysieren.
String json = "{dateTime: \"2018-03-29T11:22:33.123+09:00\"}";
SampleData s = JSON.decode(json, SampleData.class);
Eine Klasse, die Lombok verwendet, sieht so aus.
import java.time.LocalDateTime;
import lombok.Data;
import net.arnx.jsonic.JSONHint;
@Data
public class SampleData {
@JSONHint(format="yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ")
private LocalDateTime dateTime;
}
Dies ist eine Ausnahme, wie unten gezeigt, und es ist ersichtlich, dass die Annotation `` `@ JSONHint``` nicht aktiviert ist.
Exception in thread "main" net.arnx.jsonic.JSONException: {dateTime=2018-03-29T11:22:33.123+09:00}Ist Klasse asdf.asdfasd.Konnte nicht in SampleData konvertiert werden: $.dateTime
at net.arnx.jsonic.JSON$Context.convertInternal(JSON.java:1775)
at net.arnx.jsonic.JSON.parse(JSON.java:1155)
at net.arnx.jsonic.JSON.parse(JSON.java:1130)
at net.arnx.jsonic.JSON.decode(JSON.java:665)
at asdf.asdfasd.App.main(App.java:15)
Caused by: java.time.format.DateTimeParseException: Text '2018-03-29T11:22:33.123+09:00' could not be parsed, unparsed text found at index 23
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1952)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
Die Ursache hierfür ist, dass https://ja.osdn.net/projects/jsonic/ticket/35184 angibt, dass JSONIC dieser Anmerkung Vorrang einräumt, wenn ein Getter / Setter vorhanden ist. lombok generiert automatisch Getter / Setter, aber da dort kein `` `@ JSONHint``` vorhanden ist, tritt diese Situation auf.
Um dieses Problem zu umgehen, habe ich mich entschlossen, Getter / Setter für die Zieleigenschaft selbst zu definieren.
@Data
public class SampleData {
/*Getter für diese Eigenschaft/Da ein Setter nicht erforderlich ist, wird die automatische Erzeugung unterdrückt*/
@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)
private LocalDateTime d;
public LocalDateTime getDateTime() {
return d;
}
@JSONHint(format="yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ")
public void setDateTime(LocalDateTime dateTime) {
this.d = dateTime;
}
}
Recommended Posts