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 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> nil code>, chiffres, chaînes ou tout autre type d'objet / classe JVM. Exception in thread "main" com.fasterxml.jackson.core.JsonGenerationException: Cannot JSON encode object of class: class java.io.File: foo
4 Réponses :
avec Cheshire Vous pouvez ajouter un codeur pour java.lang.Object
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 code> plutôt que .writetring code> directement :)
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 code> ou * classe * code>, comme celui-ci, de sorte que le désérialiseur puisse trouver les bons types: p> < Pré> xxx pré> p>
À moins que je manque quelque chose, il n'y a pas besoin de JSON ici. Il suffit d'utiliser 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 Vous pouvez obtenir le résultat en tant que chaîne (appropriée pour prn code>: code> de toute façon. p> 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\"]"}
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.
Vous pouvez également remplacer la méthode 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: p> imprimée code> pour certains objets qui vous intéressent: