Pagina 1 di 1

Espressione regolare per rimuovere commenti da un file json

Inviato: sab 23 feb 2013, 9:35
da ilmich
Ciao a tutti,

come da oggetto sto sviluppando un progetto in java che sfrutta il formato json per i file di configurazione.
Col senno di poi avrei fatto tutto in xml, ma java e xml sono un'accoppiata relativamente e inutilmente complicata :D
Ad ogni modo, il problema che ho con questo formato è che essendo nato prevalentemente per lo scambio di dati non contempla l'utilizzo di parti commentate. Questo un po' mi limita nel contesto in cui lo utilizzo perchè mi sarebbe utile avere dei file di configurazione con porzioni commentate.

La soluzione che ho pensato è quella di leggere il file in una stringa, manipolarla con una espressione regolare e darla poi in pasto al parser json.
L'espressione regolare dovrebbe eliminare i pezzi indesiderati secondo le seguenti due regole
  • dal primo carattere '#` fino a fine linea
  • dalla prima sequenza di caratteri '/*' fino a '*/'
.. essendo una schiappa con le espressioni regolari, mi date qualche dritta su come scriverla?!?!

grazie in anticipo

Re: Espressione regolare per rimuovere commenti da un file j

Inviato: sab 23 feb 2013, 10:19
da 414N
Prima di tuffarci nel meraviglioso mondo delle espressioni regolari, posso chiederti se hai pensato ad altre alternative oltre a JSON e XML?
Se il progetto è tutto in Java la prima opzione che mi viene in mente è un file di proprietà (ovvero un insieme di chiavi-valori in formato testo) facilmente gestiti dalle API Java (vedi questo tutorial ufficiale).
Un'altra alternativa, più "omnicomprensiva" delle proprietà sarebbe lo sfruttamento delle Preferences API, che includono un backend di storage per rendere persistenti (in maniera platform dependent su ogni piattaforma) le preferenze specificate. Trovi un esempio qua, nella documentazione ufficiale di Java (sono in giro dalla versione 1.4, come puoi vedere dal link) e, se ti servisse, posso mostrarti del codice relativo al loro impiego.

Re: Espressione regolare per rimuovere commenti da un file j

Inviato: sab 23 feb 2013, 10:49
da invalid_packet
Potresti anche pensare ad inserire un parametro di nome "description" o "comment" o "remark" fra i dati stessi.

Qualcosa tipo:

Codice: Seleziona tutto


{
    "fieldname":"nome",
    "key":"true",
    "index":"0",
    "description":"a short description"
}


Re: Espressione regolare per rimuovere commenti da un file j

Inviato: sab 23 feb 2013, 11:09
da ilmich
@414n la scelta tecnica è stata fatta in base ad un semplice concetto... semplicità! non conoscevo le Preference Api pero' espresso in altri termini volevo avere un pojo da utilizzare come configurazione, che mi consentisse di non dover fare refactoring esteso, almeno per la parte di caricamente da file.
attualmente tramite Google GSON il caricamento del file di configurazione viene gestito da un metodo banale simil questo

Codice: Seleziona tutto

public static void loadFromFile(String file, Type type) {
	File confFile = new File(file);
	Reader conf = null;
	Gson gs = new Gson();
	Object confObj = null;
	try {
	    conf = Files.newReader(confFile, Charset.forName("UTF-8"));
	    confObj = gs.fromJson(conf, type);
	    configuration = confObj;
	} catch (Exception e) {
	    e.printStackTrace();
	} finally {
	    try {
		if (conf != null)
		    conf.close();
	    } catch (IOException e) {
		e.printStackTrace();
	    }
	}
    }
Ti ripeto, non conosco le refactoring api, ma in questo modo posso:
  • disaccoppiare l'oggetto configurazione, con lo storage.. che a sto punto puo' essere qualsiasi cosa (nello specifico il progetto in questione è un server smtp.. quindi per configurare il connettore, potrei tecnicamente includere nella configurazione l'oggetto java che lo definisce.. senza gestire travasi properties -> oggetto di nessun tipo.)
  • se aggiungo una flag, non devo curarmi dello storage.. basta aggiundere un campo nel json e ovviamente modificare il codice che utilizza sta configurazione
  • posso gestire diversi file di configurazione in un colpo solo.. e senza l'onere di dover configurare il sistema di configurazione.. che soprattutto in java è una cosa che mi urta assai.. ovvero complicare l'incomplicabile
@invalid_packet mi sa che forse mi sono spiegato male.. io intendo commentare come possibilità di avere roba tipo

Codice: Seleziona tutto

{
	"port":9999,
	"workers":120,
	"maxConnections":100,
	"mailDir":"outmail",
	"sessionConfig":{
					"mail.user":"bart",
					"mail.host":"example.org"
                                        # questo parametro è commentato.. decommentare in produzione
                                        # "mail.host":"pippopluto.org"
					}
         }
che venga visto in modo corretto:D