2016-09-17 1 views
0

Mon script Groovy crée un fichier JSON qui ressemble à ceci:citations inutiles ajoutés aux éléments de fichiers JSON en utilisant JsonOutput dans Groovy

JSON output

Il y a un nombre variable d'éléments qui entrent dans le tableau HSP. Fondamentalement, ma sortie est correcte mais le script ajoute des citations inutiles à l'élément. Le code correspondant ressemble à ceci:

foundPlasmids.each { 
    def tempHSPs = [] 
    it.hsps.each{ 
     def hsps = JsonOutput.toJson(
      [bit_score: it.bit_score, 
      evalue: it.evalue, 
      score: it.score, 
      query_from: it.query_from, 
      query_to: it.query_to, 
      hit_from: it.hit_from, 
      hit_to: it.hit_to, 
      align_len: it.align_len, 
      gaps: it.gaps] 
     ) 
     tempHSPs << JsonOutput.prettyPrint(hsps) 
    } 

    def output = JsonOutput.toJson(
     [contig: it.contig, title: it.title, accNumber: it.accession, length: it.length, noHSPs: it.noHsps, hsps: tempHSPs] 
    ) 

    prettyOutput << JsonOutput.prettyPrint(output) 
} 

foundPlasmids est un hachage contenant toutes les informations, y compris les tableaux hsps. I prettyPrint tous les hsps tableaux dans tempHSPs et passez tempHSPs à output. Je ne peux pas comprendre pourquoi les citations supplémentaires sont ajoutées et ne peux pas penser à une manière différente de passer les tableaux hsps dans output. Merci pour toute aide.

Répondre

0

Les objets que vous mettez dans le tableau tempHSPs sont des représentations sous forme de chaîne de JSON et ils sont produits par la fonction prettyPrint. Toutes les fonctions toJson dans JsonOutput retournent des chaînes, et prettyPrint prend une chaîne, la formate et renvoie une chaîne.

Ce que vous êtes pas mettre en tempHSPs est un objet ou un tableau JSON réel. Vous mettez une chaîne, et ainsi la sortie finale contient, dans chaque élément de premier niveau, un tableau "hsps" contenant une seule valeur de chaîne.

Il y a deux problèmes avec ceci. L'un est que les chaînes ne sont pas échappées correctement par l'appel à def output = JsonOutput.toJson, que je peux seulement supposer est un bogue dans la classe JsonOutput? Cela semble improbable, mais je n'ai pas une meilleure explication. Il devrait ressembler davantage ...

[ 
    { 
     "nohsps": 1, 
     "hsps": [ 
      "{\r\n \"bit_score\": 841.346,\r\n \"evalue\": 0,\r\n (and so on)\r\n}" 
     ] 
    }, 
    { 
     "nohsps": 6, 
     "hsps": [ 
      "{\r\n \"bit_score\": 767.48,\r\n \"evalue\": 0,\r\n (and so on)\r\n}" 
     ] 
    } 
] 

Le deuxième problème est qu'il semble que vous ne vouliez pas les chaînes, mais voulait plutôt des objets JSON, donc juste arrêter de tourner vos objets Groovy en chaînes ...

def tempHSPs = [] 
it.hsps.each{ 
    def hsps = 
     [bit_score: it.bit_score, 
     evalue: it.evalue, 
     score: it.score, 
     query_from: it.query_from, 
     query_to: it.query_to, 
     hit_from: it.hit_from, 
     hit_to: it.hit_to, 
     align_len: it.align_len, 
     gaps: it.gaps] 
    ) 
    tempHSPs << hsps 
} 

ou, si vous voulez simplifier, supprimer tout ce genre de choses à propos tempHSPs, nous JsonObject sérialiser les automatiquement, et voir ce qu'il arrive avec automatiquement:

def output = JsonOutput.toJson(
     [contig: it.contig, title: it.title, accNumber: it.accession, length: it.length, noHSPs: it.noHsps, hsps: foundPlasmids*.hsps ] 
    ) 

(Je n'ai pas validé cette syntaxe; Je travaille juste de la mémoire.)

Si il s'étouffe sur l'objet hsps ou que vous n'aimez pas la sortie résultante (par exemple, si vous souhaitez supprimer ou renommer certaines propriétés), reprenez la création de la carte comme vous re faire maintenant.