[JAVA] Que faire si l'annotation JSON Hint ne fonctionne pas avec Lombok et JSONIC

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.

Version utilisée

<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>

Symptômes et solutions de contournement

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;
	}
}

Recommended Posts

Que faire si l'annotation JSON Hint ne fonctionne pas avec Lombok et JSONIC
Que faire si l'annotation JSON Hint ne fonctionne pas avec Lombok et JSONIC
N'utilisez pas de flotteurs et de doubles pour calculer les fractions monétaires
Que faire si le point d'arrêt est grisé et ne s'arrête pas pendant le débogage
Que faire lorsque la validation ne fonctionne pas avec l'action de mise à jour
Que faire si vous avez installé Ruby avec rbenv mais que la version ne change pas
[Ubuntu 20.04] Que faire si le moniteur externe n'est pas reconnu
Que faire si vous sélectionnez un JRE dans Eclipse et obtenez "Le JRE sélectionné ne prend pas en charge le niveau de conformité actuel 11"
Que faire si l'application n'est pas créée avec la dernière version de Rails installée lorsque les rails sont neufs
Que faire si l'image d'arrière-plan n'est pas appliquée après le déploiement
Que faire lorsque le préfixe c n'est pas lié dans JSP
Que faire si le serveur Tomcat meurt
Que faire si les modifications ne sont pas reflétées dans le fichier manifeste JAR
[Grails] Une erreur s'est produite lors de l'exécution Que faire lorsque la CLI Grails ne démarre pas
Que faire quand est invalide car il ne commence pas par un "-"
Que faire si l'installation du gem de débogage échoue
Que faire si le serveur Rails ne peut pas démarrer
Que faire si TextToSpeech ne fonctionne pas sur Android 11
Que faire lorsque les paramètres de routage ne fonctionnent pas après la création d'un environnement Docker avec Laravel
Que faire si vous ne pouvez pas exécuter avec la commande "nom du package Java / nom de la classe"
Que faire si FacesMessage est défini mais pas affiché
Que faire si la commande adb ne peut pas être exécutée
Que faire si la commande rails devient inutilisable
Que faire si vous modifiez l'adresse d'écoute à partir de l'écran des paramètres dans le menu fixe Mattermost
[Rails] Que faire si vous ne pouvez pas obtenir de message d'erreur avec la méthode des erreurs
Que faire lorsque la "relation" hibernate_sequence "n'existe pas" dans la colonne ID de PostgreSQL + JPA
[Rails] Que faire si les données ne sont pas enregistrées dans la base de données
Que faire si Intel RST (technologie de stockage rapide) interfère avec le double démarrage d'Ubuntu20.04LTS et Windows10
Que faire lorsque les modifications du servlet ne sont pas reflétées
Que faire si la page Rails n'est pas affichée dans le didacticiel Rails 1.3.2
Que faire lorsque Cloud 9 est plein dans le didacticiel Rails
Que faire si vous vous fâchez contre OpenSSL avec Pyenv Install
[Rails 5] [Turbolinks] Que faire lorsque JS ne fonctionne pas en raison d'une transition de page ou d'un retour du navigateur
[Logback] Que faire si les fichiers inutiles ne disparaissent pas pendant la rotation
Que faire si vous oubliez votre mot de passe root sur CentOS7
[Rails] Que faire si vous ne pouvez pas obtenir de paramètres avec form_with
Que faire si l'opération non autorisée s'affiche lors de l'exécution d'une commande dans le terminal
Que faire si vous obtenez l'erreur Trop long sans sortie (dépassé 10m0s) dans CircleCI
Que faire si JavaMail ne peut pas être utilisé avec OpenJDK 11 ou version ultérieure
Comment interagir avec un serveur qui ne plante pas l'application
[IOS] Que faire lorsque l'image est remplie d'une seule couleur
Que faire si les modifications ne sont pas reflétées après le déploiement automatique vers EC2
Ajouter gem'rails-i18n ',' ~> 6.0.0 'et que faire si l'installation du bundle donne une erreur
Que faire si vous ne pouvez pas installer le plug-in à partir d'Eclipse Marketplace
Que faire si le déploiement échoue dans Heroku (application Ruby non détectée)
Que faire si la construction échoue avec l'erreur «Le module compilé avec Swift x.x.x ne peut pas être importé par le compilateur Swift x.x.x»
Que faire si vous avez activé Utiliser le moteur basé sur WSL2 dans Docker Desktop avec une installation WSL2 insuffisante
Que faire si vous obtenez Impossible de localiser le répertoire Gemfile ou .bundle /
Que faire si vous ne pouvez pas activer la boîte de sélection créée par bootstrap-select
Comment faire fonctionner @Transactional qui ne fonctionne pas si vous ne l'utilisez pas correctement
Que faire quand Pour installer la version manquante, exécutez `gem install bundler: 2.1.4`
Si le raccourci Ctrl + ne fonctionne pas dans Eclipse, la désactivation de Welcome peut aider