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.