web-dev-qa-db-fra.com

Sérialisation de la carte groovy en chaîne avec des guillemets

J'essaie de conserver une carte groovy dans un fichier. Ma tentative actuelle est d'écrire la représentation sous forme de chaîne, puis de la relire et d'appeler evaluate dessus pour recréer la carte lorsque je suis prêt à l'utiliser à nouveau.

Le problème que j'ai, c'est que la méthode toString() de la carte supprime les citations vitales des valeurs des éléments. Lorsque mes appels de code sont évalués, il se plaint d'un identifiant inconnu.

Ce code illustre le problème:

m = [a: 123, b: 'test']
print "orig: $m\n"

s = m.toString()
print " str: $s\n"

m2 = evaluate(s)
print " new: ${m2}\n"

Les deux premières instructions print fonctionnent presque - mais les guillemets autour de la valeur de la clé b ont disparu. Au lieu d'afficher [a: 123, b: 'test'], ça montre [a: 123, b: test].

À ce stade, le dommage est fait. L'appel evaluate s'étouffe lorsqu'il essaie d'évaluer test en tant qu'identifiant et non en tant que chaîne.

Donc, mes questions spécifiques:

  1. Existe-t-il un meilleur moyen de sérialiser/désérialiser des cartes dans Groovy?
  2. Existe-t-il un moyen de produire une représentation sous forme de chaîne d'une carte avec des guillemets appropriés?
26
Doug Harris

Groovy fournit la méthode inspect() renvoie un objet sous forme de chaîne analysable:

// serialize
def m = [a: 123, b: 'test']
def str = m.inspect()

// deserialize
m = Eval.me(str)

Une autre façon de sérialiser une carte groovy en tant que chaîne lisible est avec JSON:

// serialize
import groovy.json.JsonBuilder
def m = [a: 123, b: 'test']
def builder = new JsonBuilder()
builder(m)
println builder.toString()

// deserialize
import groovy.json.JsonSlurper
def slurper = new JsonSlurper()
m = slurper.parseText('{"a": 123, "b": "test"}')
55
ataylor

Vous pouvez utiliser myMap.toMapString()

4
DMoney