0
votes

Comment représenter des objets Java non standard lors de l'encodage à JSON à Clojure?

J'ai une carte de clojure standard des choses. Les clés sont des mots-clés et les valeurs sont des valeurs arbitraires. Ils peuvent être nil code>, chiffres, chaînes ou tout autre type d'objet / classe JVM.

J'ai besoin de savoir comment encoder cette carte en Json, de sorte que les valeurs "normales" de la carte Valeurs JSON habituelles (par exemple, mots-clés -> chaînes, entiers -> Numéros JSON, etc.), tandis que des valeurs de toute autre carte de classe aux représentations de chaîne de ces valeurs, comme celle-ci: P>

Exception in thread "main" com.fasterxml.jackson.core.JsonGenerationException: Cannot JSON encode object of class: class java.io.File: foo


0 commentaires

4 Réponses :


2
votes

avec Cheshire Vous pouvez ajouter un codeur pour java.lang.Object xxx


2 commentaires

Le plus prometteur jusqu'à présent. Je vais tester l'idée et vous faire savoir comment ça se passe, merci.


Ça l'a fait! Bien que j'ajouterai, j'ai trouvé qu'il est nettoyé d'invoquer générer / écriture-chaîne plutôt que .writetring directement :)



0
votes

Cheshire comprend Encodeurs personnalisés que vous pouvez créer et vous inscrire pour sérialiser des classes arbitraires.

OTOH Si vous souhaitez lire le JSON et reproduire les mêmes types de java, vous devrez également ajouter des métadonnées. Un modèle commun est d'encoder le type comme un champ comme __ type ou * classe * , comme celui-ci, de sorte que le désérialiseur puisse trouver les bons types: < Pré> xxx


0 commentaires

0
votes

À moins que je manque quelque chose, il n'y a pas besoin de JSON ici. Il suffit d'utiliser prn code>: xxx pré>

parfaitement lisible. P>

Comme Denis dit, vous aurez besoin de plus de travail si vous souhaitez lire les données, mais cela est impossible pour des choses comme un fichier code> de toute façon. p>

Vous pouvez obtenir le résultat en tant que chaîne (appropriée pour println code> etc.) à l'aide d'une fonction associée jolie-str code> si vous préférez: p>

-------------------------------
   Clojure 1.10.1    Java 14
-------------------------------

Testing tst.demo.core
:converted {"a":1,"b":"foo","f":"#object[java.io.File 0x40429f12 \"/tmp/foo.txt\"]"}


1 commentaires

Je m'excuse de ne pas faire cela clair, mais toute la sortie et l'entrée de la bibliothèque particulière que j'écris est de standard et de standard dans Via Json. La carte ferait réellement partie d'une carte plus grande qui est sortie dans JSON Set, de sorte que le JSON est simplement une nécessité de la construction.



1
votes

Vous pouvez également remplacer la méthode imprimée pour certains objets qui vous intéressent: xxx

La méthode est appelée par le sous-système d'impression à chaque fois qu'il a besoin Pour imprimer l'objet de ce type: xxx


0 commentaires