Une note sur la solution de contournement car l'annotation `` @ JSONHint '' ne fonctionnait pas bien lors de l'utilisation conjointe de JSONIC et de lombok.
<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>
Supposons que vous souhaitiez analyser un JSON contenant une chaîne de date au format suivant comme exemple.
String json = "{dateTime: \"2018-03-29T11:22:33.123+09:00\"}";
SampleData s = JSON.decode(json, SampleData.class);
Une classe qui utilise lombok ressemble à ceci.
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;
}
Il s'agit d'une exception comme indiqué ci-dessous, et vous pouvez voir que l'annotation
@ JSONHint '' n'est pas activée.
Exception in thread "main" net.arnx.jsonic.JSONException: {dateTime=2018-03-29T11:22:33.123+09:00}Est la classe asdf.asdfasd.Impossible de convertir en SampleData: $.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)
La cause en est que https://ja.osdn.net/projects/jsonic/ticket/35184 indique que s'il y a un getter / setter, JSONIC donnera la priorité à cette annotation. lombok génère automatiquement getter / setter, mais comme il n'y a pas de
@ JSONHint```, cette situation se produit.
Donc, comme solution de contournement, j'ai décidé de définir moi-même getter / setter pour la propriété cible.
@Data
public class SampleData {
/*Obtenir pour cette propriété/Le setter n'étant pas nécessaire, la génération automatique est supprimée*/
@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;
}
}