2012-04-25 12 views
29

Per installare un'estensione esterna nel browser Google Chrome, provo ad aggiornare il file json dell'estensione esterna di Chrome. Utilizzando Json.NET Sembra essere facile:Come posso leggere JSON con commento con Json.NET

string fileName = "..."; // path to chrome external extension json file 

string externalExtensionsJson = File.ReadAllText(fileName); 

JObject externalExtensions = JObject.Parse(externalExtensionsJson); 


ma ottengo un Newtonsoft.Json.JsonReaderException dicendo:

"Error parsing comment. Expected: *, got /. Path '', line 1, position 1." 


al momento della chiamata JObject.Parse perché questo file contiene:

// This json file will contain a list of extensions that will be included 
// in the installer. 

{ 
} 

e commenti non fanno parte di JSON (come visto in How do I add comments to Json.NET output?).

So che posso rimuovere i commenti con un Regex (Regex to remove javascript double slash (//) style comments) ma ho bisogno di riscrivere JSON in file dopo la modifica e mantenere un commento può essere un buon pensiero.

Domanda: C'è un modo per leggere JSON con commenti senza rimuoverli ed essere in grado di riscriverli?

risposta

36

Json.NET supporta solo la lettura multilinea commenti JavaScript, vale a dire/* * commment/

Aggiornamento: Json.NET 6.0 supporta commenta singola linea

+2

Grazie, ma non ho scelta: Google Chrome fornisce un file denominato "external_extensions.json" contenente commenti a riga singola e devo completarlo. Più in generale, Json viene spesso utilizzato come file di configurazione in cui i commenti (singole e/o linee multiple) possono essere aggiunti dagli utenti. Non abbiamo scelta: possiamo essere di fronte alla necessità di leggere ogni commento (e idealmente riscriverlo). E mi piaceva essere in grado di usare Json.Net per farlo. Pensi che possa essere una possibile evoluzione? – MuiBienCarlota

+6

perché oh perché supporta solo i commenti Javascript multilinea – tofutim

+0

La sostituzione con regex non è stata una soluzione completamente soddisfacente. Considerarlo in Json.Net era quello che speravo. Grazie! – MuiBienCarlota

3

Un po 'in ritardo, ma si può sempre convertire linea singola commenti per commentare la sintassi multi-linea prima di parsing ...

qualcosa come sostituire ...

.*//.*\n 

con

$1/*$2*/ 

...

Regex.Replace(subjectString, ".*//.*$", "$1/*$2*/"); 
+0

Buona soluzione pratica. Grazie. – MuiBienCarlota

+1

Penso che il tuo regex corrisponderà troppo.Valuta i valori json validi che contengono "//": '{url: 'http://www.forever21.com/Product/Product.aspx?br=f21&category=dress&productid=2000062214', foto: 'http: //www.forever21.com/images/default_330/00062214-02.jpg '} ' –

+1

@ScottRoberts True. Sfortunatamente, stiamo cercando di analizzare il json con regex. E in questo modo giace la follia. Detto questo, se qualcuno con una migliore esperienza in regex può risolverlo, per favore fallo. – Basic

3

Se si è bloccato con JavaScriptSerializer (dallo spazio dei nomi System.Web.Script.Serialization), ho trovato che questo funziona abbastanza bene ...

private static string StripComments(string input) 
{ 
    // JavaScriptSerializer doesn't accept commented-out JSON, 
    // so we'll strip them out ourselves; 
    // NOTE: for safety and simplicity, we only support comments on their own lines, 
    // not sharing lines with real JSON 

    input = Regex.Replace(input, @"^\s*//.*$", "", RegexOptions.Multiline); // removes comments like this 
    input = Regex.Replace(input, @"^\s*/\*(\s|\S)*?\*/\s*$", "", RegexOptions.Multiline); /* comments like this */ 

    return input; 
} 
Problemi correlati