Comment définir le format de la chaîne de java.temps.Instantanée à l'aide de objectMapper?
J'ai une entité avec java.time.Instant
pour créé champ de données:
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
public class Item {
private String id;
private String url;
private Instant createdDate;
}
Je suis en utilisant com.fasterxml.jackson.databind.ObjectMapper
pour enregistrer l'élément à Elasticsearch comme JSON:
bulkRequestBody.append(objectMapper.writeValueAsString(item));
ObjectMapper
sérialise ce domaine comme un objet:
"createdDate": {
"epochSecond": 1502643595,
"nano": 466000000
}
J'ai essayé de l'annotation @JsonFormat(shape = JsonFormat.Shape.STRING)
mais il ne fonctionne pas pour moi.
Ma question est comment je peut sérialiser ce domaine 2010-05-30 22:15:52
chaîne?
github.com/FasterXML/jackson-modules-java8/tree/master/datetime
Merci pour la réponse, j'ai ajouté
Avez-vous ajouté le module fichier jar au classpath?
Bien sûr,
Merci pour la réponse, j'ai ajouté
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
et objectMapper.findAndRegisterModules()
Il ne fonctionne pas pour moi.Avez-vous ajouté le module fichier jar au classpath?
Bien sûr,
compile group: 'com.fasterxml.jackson.module', name: 'jackson-modules-java8', version: '2.9.0', ext: 'pom'
ce unOriginalL'auteur Uladzislau Kaminski | 2017-08-13
Vous devez vous connecter pour publier un commentaire.
Une solution consiste à utiliser jackson-modules-java8. Vous pouvez ensuite ajouter un
JavaTimeModule
à votre objet mappeur:Par défaut, le
Instant
est sérialisé comme à l'époque de valeur (en secondes et nanosecondes dans un nombre simple):Vous pouvez changer cela en définissant dans l'objet du mappeur:
Ce produit le résultat:
Les deux formats ci-dessus sont désérialisé sans aucune configuration supplémentaire.
Pour changer le format de sérialisation, il suffit d'ajouter un
JsonFormat
annotation pour le domaine:Vous avez besoin de régler le fuseau horaire, sinon le
Instant
ne peut pas être sérialisé correctement (elle lève une exception). La sortie sera:Une autre alternative, si vous ne voulez pas (ou ne pouvez pas) utiliser java8 modules, est de créer un personnalisé sérialiseur et deserializer, à l'aide d'un
java.time.format.DateTimeFormatter
:Alors vous annoter le terrain avec ceux des classes personnalisées:
La sortie sera:
Un détail, c'est que dans la chaîne sérialisée par un rejet de la fraction de seconde (tout ce qui est après la virgule). Ainsi, lors de la désérialisation, cette information ne peut pas être récupéré (il va être mis à zéro).
Dans l'exemple ci-dessus, l'original
Instant
est2017-08-14T12:17:47.720Z
, mais la chaîne sérialisée est2017-08-14 12:17:47
(sans la fraction de secondes), donc quand désérialisé l'résultantInstant
est2017-08-14T12:17:47Z
(le.720
millisecondes sont perdus).Simple et au point. Tous les cas couverts.
OriginalL'auteur
Vous devez ajouter en dessous de la dépendance
Puis d'enregistrer les modules comme ci-dessous :
jetez un oeil ici: baeldung.com/jackson-serialize-dates
OriginalL'auteur dassum
Pour ceux qui cherchent à analyser Java 8 horodateurs. Vous avez besoin d'une version récente de
jackson-datatype-jsr310
dans votre POM et ont le module suivant inscrit:Pour tester ce code
OriginalL'auteur UltimaWeapon
Voici quelques Kotlin code de mise en forme
Instant
, de sorte qu'il ne contient pas de millisecondes, vous pouvez utiliser de date personnalisé formateursOriginalL'auteur ZZ 5
Dans mon cas, c'était assez pour inscrire le JavaTimeModule:
De l'Objet d'événement, j'ai un champ de type Instantané.
Dans la désérialisation vous devez également enregistrer le java module:
OriginalL'auteur Laura Liparulo