2017-09-27 3 views
0

J'ai un code pour masquer les valeurs dans un fichier JSON. Mais j'ai le sentiment qu'il devrait y avoir une façon plus efficent de le faire.Plus façon efficent pour remplacer la chaîne pour masquer un fichier JSON (java)

Ceci est mon code actuel:

private static final String STRING_REPLACEMENT = "$1 \"String\" $4"; 
private static final String FLOAT_REPLACEMENT = "$1 \"float\" $4"; 
private static final String INT_REPLACEMENT = "$1 \"Integer\" $4"; 
private static final String BOOL_REPLACEMENT = "$1 \"Boolean\" $4"; 

Et le code de masquage réel:

out = out.replaceAll("(\"\\w+\"\\s?:)\\s?\"((\\\\\"|[^\"])*\")", "$1 \"String\""); 
out = out.replaceAll("(\"\\w+\"\\s?:)\\s?(\\d+\\.\\d+)", "$1 \"float\""); 
out = out.replaceAll("(\"\\w+\"\\s?:)\\s?(\\d+)", "$1 \"Integer\""); 
out = out.replaceAll("(\"\\w+\"\\s?:)\\s?(true|false)", "$1 \"Boolean\""); 

out = out.replaceAll("(\\[\\s?)\"((\\\\\"|[^\"])*\")(\\s?,)", STRING_REPLACEMENT); 
out = out.replaceAll("(,\\s?)\"((\\\\\"|[^\"])*\")(\\s?,)", STRING_REPLACEMENT); 
out = out.replaceAll("(,\\s?)\"((\\\\\"|[^\"])*\")(\\s?\\])", STRING_REPLACEMENT); 

out = out.replaceAll("(\\[\\s?)((\\d)+\\.\\d+)(\\s?,)", FLOAT_REPLACEMENT); 
out = out.replaceAll("(,\\s?)((\\d)+\\.\\d+)(\\s?,)", FLOAT_REPLACEMENT); 
out = out.replaceAll("(,\\s?)((\\d)+\\.\\d+)(\\s?\\])", FLOAT_REPLACEMENT); 

out = out.replaceAll("(\\[\\s?)((\\d)+)(\\s?,)", INT_REPLACEMENT); 
out = out.replaceAll("(,\\s?)((\\d)+)(\\s?,)", INT_REPLACEMENT); 
out = out.replaceAll("(,\\s?)((\\d)+)(\\s?\\])", INT_REPLACEMENT); 

out = out.replaceAll("(\\[\\s?)((true|false))(\\s?,)", BOOL_REPLACEMENT); 
out = out.replaceAll("(,\\s?)((true|false))(\\s?,)", BOOL_REPLACEMENT); 
out = out.replaceAll("(,\\s?)((true|false))(\\s?\\])", BOOL_REPLACEMENT); 

ce que quelqu'un a des suggestions pour améliorer cette situation. Je sais que je peux groupe le regex un peu mais je crains que cela influencera la lisibilité à Mutch. Et j'ai remarqué que si je combine les 3 lignes regex en un avec plus? en cela qu'il ne le trouve pas toujours correctement, donc le masquage échoue alors.

+2

J'éviter d'effectuer tout type de remplacement dans un langage structuré, comme JSON en traitant un 'CHAINE' et en utilisant des expressions régulières pour commencer. Il est difficile de dire ici l'efficacité (car elle dépend aussi de la taille de la charge utile et occurrences, etc.), mais pour une meilleure lisibilité/maintenabilité vous pouvez utiliser un analyseur JSON/auteur au lieu et recréer l'objet. – Mena

Répondre

1

Vous pouvez faire un HashMap avec votre regex/remplacement et itérer pour appliquer votre replaceAll

par exemple

import java.util.HashMap; 
import java.util.Map; 

public class Test { 

    private static final String STRING_REPLACEMENT = "$1 \"String\" $4"; 
    private static final String FLOAT_REPLACEMENT = "$1 \"float\" $4"; 
    private static final String INT_REPLACEMENT = "$1 \"Integer\" $4"; 
    private static final String BOOL_REPLACEMENT = "$1 \"Boolean\" $4"; 
    private static final Map<String,String> patterns; 
    static { 
     patterns = new HashMap<>(); 
     patterns.put("(\"\\w+\"\\s?:)\\s?\"((\\\\\"|[^\"])*\")", "$1 \"String\""); 
     patterns.put("(\"\\w+\"\\s?:)\\s?(\\d+\\.\\d+)", "$1 \"float\""); 
     patterns.put("(\"\\w+\"\\s?:)\\s?(\\d+)", "$1 \"Integer\""); 
     patterns.put("(\"\\w+\"\\s?:)\\s?(true|false)", "$1 \"Boolean\""); 
     patterns.put("(\\[\\s?)\"((\\\\\"|[^\"])*\")(\\s?,)", STRING_REPLACEMENT); 
     patterns.put("(,\\s?)\"((\\\\\"|[^\"])*\")(\\s?,)", STRING_REPLACEMENT); 
     patterns.put("(,\\s?)\"((\\\\\"|[^\"])*\")(\\s?\\])", STRING_REPLACEMENT); 
     patterns.put("(\\[\\s?)((\\d)+\\.\\d+)(\\s?,)", FLOAT_REPLACEMENT); 
     patterns.put("(,\\s?)((\\d)+\\.\\d+)(\\s?,)", FLOAT_REPLACEMENT); 
     patterns.put("(,\\s?)((\\d)+\\.\\d+)(\\s?\\])", FLOAT_REPLACEMENT); 
     patterns.put("(\\[\\s?)((\\d)+)(\\s?,)", INT_REPLACEMENT); 
     patterns.put("(,\\s?)((\\d)+)(\\s?,)", INT_REPLACEMENT); 
     patterns.put("(,\\s?)((\\d)+)(\\s?\\])", INT_REPLACEMENT); 
     patterns.put("(\\[\\s?)((true|false))(\\s?,)", BOOL_REPLACEMENT); 
     patterns.put("(,\\s?)((true|false))(\\s?,)", BOOL_REPLACEMENT); 
     patterns.put("(,\\s?)((true|false))(\\s?\\])", BOOL_REPLACEMENT); 
    } 
    public void test() { 
     String out="your string"; 
     for(Map.Entry<String, String> pattern :patterns.entrySet()){ 
      out = out.replaceAll(pattern.getKey(), pattern.getValue()); 
     } 
    } 
} 

Mais, il sera préférable de unserialize, les valeurs de mise à jour et re sérialiser votre JSON avec un api

+0

Mais cela ne le rendrait pas vraiment plus efficace. Je suppose que cela finira par être encore plus inefficace et qu'il y aura plus de code que l'implémentation actuelle. –

+0

vous avez raison, ce n'est pas plus efficace. mais je pense que c'est un peu plus propre –