es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Carácter inesperado al analizar una cadena de JSON.

Estoy serializando un objeto en un flujo para almacenarlo como archivo y luego intentar recuperarlo y deserializarlo, pero me da un error al analizar. A continuación se muestra el código:

var contenido = JsonConvert.SerializeObject(data);
var salida = new MemoryStream();
var escritor = new StreamWriter(salida, Encoding.UTF8);
escritor.Write(contenido);
escritor.Flush();
//escribir en algún archivo…

//al leer el archivo
Stream archivo;
//archivo abre un flujo de archivo
byte[] buffer = new byte[4096]
using (MemoryStream ms = new MemoryStream())
{
int leer;
while ((leer = archivo.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, leer);
}
var data = Encoding.UTF8.GetString(ms.ToArray());
//ocurre un error aquí. Puedo ver que los primeros caracteres de la cadena son signos de interrogación.
JsonConvert.DeserializeObject<T>(data);

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema en el código anterior es que los datos que se leen desde el archivo están siendo tratados como una cadena codificada en UTF8 cuando en realidad es una secuencia binaria. Por lo tanto, la deserialización falla ya que los datos no están en el formato esperado. Para resolver este problema, en lugar de utilizar el método Encoding.UTF8.GetString(), necesitamos deserializar directamente la matriz de bytes, como se muestra a continuación:

    usando (MemoryStream ms = nueva MemoryStream())
    {
        int leido;
        mientras ((leido = filestream.Read(buffer, 0, buffer.Length)) > 0)
        {
            ms.Write(buffer, 0, leido);
        }
        ms.Position = 0; //resetear posición antes de la deserialización
        var serializer = nuevo JsonSerializer();
        usando (var sr = nueva StreamReader(ms))
        usando (var jsonTextReader = nuevo JsonTextReader(sr))
        {
            return serializer.Deserialize<t>(jsonTextReader);
        }
    }
    

    Aquí, primero deserializamos la matriz de bytes a un objeto utilizando las clases JsonSerializer y JsonTextReader. Reiniciamos la posición del MemoryStream a 0 antes de la deserialización para asegurarnos de que se lea toda la matriz de bytes. Esto debería resolver el problema con el error de análisis.

Comments are closed.