2012-04-25 45 views
29

Para instalar una extensión externa en el navegador Google Chrome, intento actualizar el archivo json de extensión externa de Chrome. Usando Json.NET parece ser fácil:¿Cómo puedo leer json con un comentario con Json.NET

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

string externalExtensionsJson = File.ReadAllText(fileName); 

JObject externalExtensions = JObject.Parse(externalExtensionsJson); 


pero me da un Newtonsoft.Json.JsonReaderException diciendo:

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


al llamar JObject.Parse porque este archivo contiene:

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

{ 
} 

y comentarios no son parte de json (como se ve en How do I add comments to Json.NET output?).

Sé que puedo eliminar comentarios con un Regex (Regex to remove javascript double slash (//) style comments) pero necesito volver a escribir json en el archivo después de la modificación y mantener el comentario puede ser una buena idea.

Pregunta: ¿Hay alguna manera de leer json con comentarios sin eliminarlos y poder reescribirlos?

Respuesta

36

Json.NET sólo admite la lectura de los comentarios de varias líneas de JavaScript, es decir,/* * commment/

Actualización: Json.NET 6.0 soporta sola línea comenta

+2

Gracias pero no tengo otra opción: Google Chrome proporciona un archivo llamado "external_extensions.json" que contiene comentarios de una sola línea y debo completarlo. Más generalmente, Json se usa a menudo como archivo de configuración donde los usuarios pueden agregar comentarios (líneas individuales y/o múltiples). No tenemos otra opción: podemos enfrentar la necesidad de leer cada comentario (e idealmente reescribirlo). Y me gustaba poder usar Json.Net para hacerlo. ¿Crees que puede ser una posible evolución? – MuiBienCarlota

+6

por qué oh, ¿por qué solo es compatible con comentarios de varias líneas de Javascript? – tofutim

+0

Reemplazar con expresiones regulares no era una solución completamente satisfactoria. Tomándolo en cuenta en Json.Net era lo que esperaba. ¡Gracias! – MuiBienCarlota

3

Un poco tarde, pero siempre se puede convertir de una sola línea, comenta a la sintaxis de comentario de varias líneas antes de analizar ...

algo así como sustituir ...

.*//.*\n 

con

$1/*$2*/ 

...

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

Buena solución práctica. Gracias. – MuiBienCarlota

+1

Creo que su expresión regular coincidirá demasiado.Tenga en cuenta valores json válidos que tienen "//" en ellos: '{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 Es cierto. Desafortunadamente, estamos a punto de intentar analizar json con expresiones regulares. Y de esa manera yace la locura. Dicho eso, si alguien con mejores habilidades de expresión regular puede arreglarlo, por favor hazlo. – Basic

3

Si le pegan con JavaScriptSerializer (desde el espacio de nombres System.Web.Script.Serialization), he encontrado que esto funciona bastante bien ...

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; 
} 
Cuestiones relacionadas