Comment conserver le champ de Date que ISODate() à l'aide de jackson dans MongoDb
Je suis en train d'essayer de persister un objet java ayant java.util.Date
champ de mongo collection à l'aide de fasterxml jackson.
Le problème, c'est la valeur par défaut de la nature de objectMapper est de stocker Date NumberLong type.
Pour l'e.g , un createdTime
champ de java.util.Date
type est enregistré comme ci-dessous:
"createdTime" : NumberLong("1427728445176")
Je veux stocker dans ISODate format qui est disponible dans le Shell mongo.
Maintenant, je sais que c'est la façon de le format de l'objet mappeur pour stocker la Date dans une Chaîne dateformat.
Mais je suis SEULEMENT à la recherche de ISODate (format.
Pour l'e.g
"createdTime" : ISODate("2015-01-20T16:39:42.132Z")
Est-il un moyen de le faire ?
Veuillez informer gourous .
Merci d'avance pour l'aide.
OriginalL'auteur vishy | 2015-03-30
Vous devez vous connecter pour publier un commentaire.
Ce que vous avez besoin est la Jackson Joda Module. Si vous importez-le dans votre classpath, vous pouvez effectuer les opérations suivantes sur votre mappeur de l'écrire comme Timestamp:
Vous pouvez remplacer
date
dans l'exemple de code ci-dessus avec votre POJO que nécessaire.Edit:
Il ressemble à ce que vous voulez vraiment est une coutume sérialiseur. Qui ressemblerait à quelque chose comme ceci:
Alors vous allez vous inscrire sur le mappeur pour tous les types DateTime
ou de le spécifier sur la fonction à l'aide d'annotations
Voir mise à jour de réponse.
Merci @xathien. J'ai mis à jour le post avec ma réponse, mais a accepté votre réponse comme une réponse , car il m'a orienté dans le bon sens 🙂
Hé, n'est-il pas
@JsonSerialize
pas@JsonSerializer
?Yep, mais la modification serait trop petit pour DONC à accepter. 🙂
OriginalL'auteur xathien
J'ai été en mesure de sérialiser la chaîne de date ISODate format. J'ai écrit une date de client sérialiseur comme ci-dessous.
Fonction de la demande de l'utilisateur @mmx73, je suis l'ajout de code pour la Date de client DeSeriaizer.
Grâce à dieu, je devenais folle à ce sujet. La plupart des solutions sont en mesure de sérialiser et deserialitze des Dates, mais dans MongoDB est a été stocké comme une Chaîne de caractères ou un Int64. Les deux n'aide pas beaucoup whenn l'ajout d'un TTL de l'index. 2 pouces vers le haut.
Content que cela vous serait utile.
ici, vous allez @mmx73
Après une discussion avec les admins à une double question à celui-ci, je vous recommande la marque de votre réponse car l'acceptés (correct) répondre à l'une que l'autre n'est ni complète, ni correct. juste mes 2cts.
OriginalL'auteur vishy
Aucune de ces réponses accompli ce que je voulais. J'ai eu du mal parce que quand je sérialisé la chaîne JSON pour MongoDB, il a été stocké dans une Chaîne de caractères. Un bien mis en forme de la chaîne, mais une chaîne de caractères.
J'utilise le com.fasterxml.jackson.databind.ObjectMapper pour convertir mes objets/à partir de JSON et je voulais continuer à utiliser cette classe. J'ai la méthode suivante:
Maintenant, je peux exécuter le test suivant code:
La sortie est comme suit:
Noter que le JSON qui sera envoyé à MONGODB définit la valeur contenant un champ nommé "$date". Cela dit MongoDB que c'est un objet date, il me semble.
Quand je regarde Mongo, je vois les suivantes:
Maintenant, je peux accéder au champ comme une date plutôt que comme une chaîne.
Pour ajouter un système de chaîne JSON à Mongo, mon code est comme suit:
Dans ce cas, "json" est codé chaîne JSON. Parce qu'il est issu d'une chaîne JSON, il n'a aucun moyen de connaître les types, sauf si elle en déduit, ce qui est pourquoi nous avons besoin de la "$date". Le "seau" est juste une chaîne de caractères indiquant la table à utiliser.
Comme une note de côté, j'ai découvert que si je tire un BFILS objet de Mongo et de la convertir en une chaîne JSON en appelant doc.la méthode toJson() (où le doc est de type org.bison.Document retourné par une requête), l'objet date est stockée avec une valeur de type long plutôt qu'un texte mis en forme de chaîne. Je n'ai pas vérifié pour voir si je pouvais envoyer des données dans mongo après la mise en forme de cette façon, mais, vous pouvez modifier la deserializer indiqué ci-dessus à l'appui de cette comme suit:
Vous pouvez convertir millisecondes à une Date ou DateTime comme suit:
OriginalL'auteur Andrew
Dans le cas où vous obtenez un message comme
com.fasterxml.jackson.core.JsonGenerationException: Can not write a field name, expecting a value
.Assurez-vous d'utiliser
writeRawValue
au lieu de cela, dans la réponse. Que se termine le champ correctement, sinon le champ sérialiser peut lancer cette erreur.OriginalL'auteur dkrones