Saltar al contenido

Json: cómo quitar correctamente los caracteres de escape con json.net

Este dilema se puede solucionar de diversas formas, pero te dejamos la resolución más completa para nosotros.

Solución:

Tratar string contentCorrected = contentCorrected.Replace(@"", "");antes del proceso de deserialización.

LA RESPUESTA CORTA: primero necesitas deserializar el escape stringpero no al tipo de CLR de destino, pero deserializar a otro string:

// Initial example json string:  ""\"Property1\":1988,\"Property2\":\"Some data :D\"""


// First, deserialize to another string (unescaped string).
string unescapedJsonString = JsonConvert.DeserializeObject(escapedJsonString);
Debug.WriteLine(unescapedJsonString);
// Prints:
// ""Property1":1988,"Property2":"Some data :D""


// Second, deserialize to another string, again (in this case is necessary)
var finalUnescapedJsonString = JsonConvert.DeserializeObject(unescapedJsonString);
Debug.WriteLine(finalUnescapedJsonString);
// This time prints a final, unescaped, json string:
// "Property1":1988,"Property2":"Some data :D"


// Finally, perform final deserialization to the target type, using the last unescaped string.
MyClass targetObject = JsonConvert.DeserializeObject(finalUnescapedJsonString);

RESPUESTA LARGA (pero interesante)
Utilizando string.Replace(... podría generar un inválido stringporque podría dañar ciertos caracteres especiales que necesitaban la barra invertida para deserializarse correctamente .

Este tipo de cadenas escapadas generalmente se generan cuando un string eso ya era un json string, se vuelve a serializar (o incluso más veces). Esto provoca algo así como “varios niveles de serialización” (realmente es una serialización de un string con caracteres reservados), y el resultado son caracteres de barra invertida (o grupos de una, dos o más barras invertidas seguidas: , \, \) dispersos por todo el string. Por lo tanto, para eliminarlos correctamente no basta con reemplazarlos por vacíos.

LA DIRECCION CORRECTA: Una mejor manera de obtener un sin escape string sería hacer una primera deserialización para string type (Repita esto varias veces si es necesario), y luego haga una deserialización final para apuntar al tipo CLR:

// -- SERIALIZATION --

// Initial object
MyClass originObj = new MyClass  Property1 = 1988, Property2 = "Some data :D" ;

// "First level" Of serialization.
string jsonString = JsonConvert.SerializeObject(originObj);
Debug.WriteLine(jsonString);
// Prints: 
// "Property1":1988,"Property2":"Some data :D"


// "Second level" of serialization.
string escapedJsonString = JsonConvert.SerializeObject(jsonString);
Debug.WriteLine(escapedJsonString);            
// ""Property1":1988,"Property2":"Some data :D""
// Note the initial and final " character and de backslash characters

// ...
// at this point you could do more serializations ("More levels"), Obtaining as a result more and more backslash followed,
// something like this:
// ""\"Property1\":1988,\"Property2\":\"Some data :D\"""
// Note that is... very very crazy :D
// ...

// -- DESERIALIZATION --

// First deserialize to another string (unescaped string).
string unescapedJsonString = JsonConvert.DeserializeObject(escapedJsonString);
Debug.WriteLine(unescapedJsonString);
// Prints:
// "Property1":1988,"Property2":"Some data :D"

// ...
// at this point you could repeat more deserializations to string, if necessary. For example if you have many backslash \
// ...

// Finally, perform final deserialization to the target type, using the last unescaped string.
MyClass targetObject = JsonConvert.DeserializeObject(unescapedJsonString);

Comentarios y puntuaciones

No se te olvide recomendar este post si te fue útil.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *