Se encontró un carácter inesperado al analizar el valor


113

Actualmente tengo algunos problemas. Estoy usando C # con Json.NET. El problema es que siempre obtengo:

{"Se encontró un carácter inesperado al analizar el valor: e. Ruta '', línea 0, posición 0."}

Entonces, la forma en que estoy usando Json.NET es la siguiente. Tengo una clase que debería guardarse. La clase se ve así:

public class stats
{
    public string time { get; set; }
    public string value { get; set; }
}

public class ViewerStatsFormat
{
    public List<stats> viewerstats { get; set; }
    public String version { get; set; }

    public ViewerStatsFormat(bool chk)
    {
        this.viewerstats = new List<stats>();
    }
}

Un objeto de esta clase se completará y guardará con:

 File.WriteAllText(tmpfile, JsonConvert.SerializeObject(current), Encoding.UTF8);

La parte de guardado funciona bien y el archivo existe y está lleno. Después de eso, el archivo se volverá a leer en la clase con:

    try 
{ 

    ViewerStatsFormat current = JsonConvert.DeserializeObject<ViewerStatsFormat>(tmpfile);
    //otherstuff        

}
catch(Exception ex)
{
    //error loging stuff
}

Ahora en la línea current = viene la excepción:

{"Se encontró un carácter inesperado al analizar el valor: e. Ruta '', línea 0, posición 0."}

No sé por qué viene esto. El archivo json es el siguiente -> Haga clic en mí en el enlace JSON

¿Alguien tiene alguna idea?


2
He editado tu título. Consulte " ¿Deben las preguntas incluir" etiquetas "en sus títulos? ", Donde el consenso es "no, no deberían".
John Saunders

¿Siempre te enfrentas a este problema sin importar los datos? Una vez, cuando enfrenté un problema de este tipo, la razón fue que el servicio enviaba caracteres UTF-8 no válidos.
ankhuri

@JohnSaunders lo siento por eso. Lo mantendré en el mío para más preguntas :).
zAfLu

1
@ankhuri se olvidó de leer en los archivos ... mi culpa
zAfLu

asumiendo que eso no es un problema, ¿qué más? recv Exception-> {"topic": "robot1 / Log", "Msg": "Pilot Running"} Se encontró un carácter inesperado al analizar el valor: o. Path '', la línea 0, la posición 0.
Spiked3

Respuestas:


149

Posiblemente no le está pasando JSON a DeserializeObject.

Parece que de File.WriteAllText(tmpfile,...ese tipo tmpfilees stringque contiene la ruta a un archivo. JsonConvert.DeserializeObjecttoma el valor JSON, no la ruta del archivo, por lo que falla al intentar convertir algo como @"c:\temp\fooo", que claramente no es JSON.


75

Resolví el problema con estas herramientas en línea:

  1. Para comprobar si la estructura de Json está BIEN: http://jsonlint.com/
  2. Para generar mi clase Object a partir de mi estructura Json: https://www.jsonutils.com/

El código simple:

RootObject rootObj= JsonConvert.DeserializeObject<RootObject>(File.ReadAllText(pathFile));

2
¿Cómo check if the Json structure está bien en C #?
Kiquenet

1
Quizás las respuestas aquí podrían ayudarlo: stackoverflow.com/questions/14977848/…
Edu Pelais

2
Gracias. json2csharp.com fue un salvavidas para mí. Al usarlo, puede realizar ingeniería inversa para ver cómo debería verse la clase correcta. ¡Gracias de nuevo!
Aamir

1
El enlace json2csharp.com ya no funciona. Recomiendo usar jsonutils.com en su lugar.
Stijn

Cambié la URL rota por una nueva como tu sugerencia @Stijn.
Edu Pelais

14

Experimenté el mismo error en mi solución Xamarin.Android.

Verifiqué que mi JSON era correcto y noté que el error solo aparecía cuando ejecuté la aplicación como una versión de versión.

Resultó que el vinculador estaba eliminando una biblioteca de Newtonsoft.JSON, lo que provocó que el JSON se analizara incorrectamente.

Solucioné el error agregando Newtonsoft.Json a la configuración Ignorar ensamblajes en la Configuración de compilación de Android (captura de pantalla a continuación)

Código de análisis JSON

static readonly JsonSerializer _serializer = new JsonSerializer();
static readonly HttpClient _client = new HttpClient();

static async Task<T> GetDataObjectFromAPI<T>(string apiUrl)
{
    using (var stream = await _client.GetStreamAsync(apiUrl).ConfigureAwait(false))
    using (var reader = new StreamReader(stream))
    using (var json = new JsonTextReader(reader))
    {
        if (json == null)
            return default(T);

        return _serializer.Deserialize<T>(json);
    }
}

Captura de pantalla de Visual Studio Mac

ingrese la descripción de la imagen aquí

Captura de pantalla de Visual Studio

ingrese la descripción de la imagen aquí


¿Cómo puedo hacerlo, en Visual Studio para la aplicación driod xamarin.forms?
Mike Darwish

1
@MikeDarwish Agregué una captura de pantalla que muestra cómo lograr esto en Visual Studio
Brandon Minnick

9

También encontré este error para una acción de API web (.Net Core 3.0) que se vinculaba a a en stringlugar de a objecto a JObject. El JSON era correcto, pero el enlazador intentó obtener una cadena de la estructura JSON y falló.

Entonces, en lugar de:

[HttpPost("[action]")]
public object Search([FromBody] string data)

Tuve que usar el más específico:

[HttpPost("[action]")]
public object Search([FromBody] JObject data)

Esto me hizo el truco en .Net Core 2.0, publicando con Postman
Vitox

También fue un dolor de cabeza para mí, pero tiene sentido porque cada json es un par clave-valor y debe proporcionar una clase con propiedades como claves para mapear correctamente json a una instancia de esa clase
Eugene Zakharov

8

En mi caso, el archivo que contiene la cadena JSON tenía BOM . Una vez que eliminé la lista de materiales, el problema se resolvió.

ingrese la descripción de la imagen aquí


5

Este problema está relacionado con la marca de orden de bytes en el archivo JSON. El archivo JSON no está codificado como datos de codificación UTF8 cuando se guarda. Usando File.ReadAllText(pathFile)arreglar este problema.

Cuando operamos con datos de Byte y los convertimos en cadenas y luego pasamos a JsonConvert.DeserializeObject, podemos usar la codificación UTF32 para obtener la cadena.

byte[] docBytes = File.ReadAllBytes(filePath);

string jsonString = Encoding.UTF32.GetString(docBytes);


3

Tuve el mismo problema con webapi en el núcleo ASP.NET, en mi caso fue porque mi aplicación necesita autenticación, luego asigna la anotación [AllowAnonymous]y funcionó.

[AllowAnonymous]
public async Task <IList <IServic >> GetServices () {
        
}

Llego tarde a la fiesta por esto, pero este también era mi problema. Al examinar el "json" que entra en mi método Deserialize, mostró que estaba tratando de autenticarse con la API.
Ben

1

Suponga que este es su json

{
  "date":"11/05/2016",
  "venue": "{\"ID\":12,\"CITY\":Delhi}"
}

si nuevamente desea deserializar el lugar, modifique json como se muestra a continuación

{
  "date":"11/05/2016",
  "venue": "{\"ID\":\"12\",\"CITY\":\"Delhi\"}"
}

luego intente deserializar a la clase respectiva tomando el valor del lugar


1
Hola, estoy usando JsonConvert.SerializeObject, que producirá el primer resultado de mí, ¿cómo obtengo el segundo?
user123456

Esto no responde a la pregunta que se hizo.
Brian Rogers

1

En mi escenario, tenía un mensaje ligeramente diferente, donde la línea y la posición no eran cero.

E. Ruta 'trabajo [0] .nombre', línea 1, posición 12.

Esta fue la mejor respuesta de Google para el mensaje que cité.

Esto sucedió porque había llamado a un programa desde la línea de comandos de Windows, pasando JSON como parámetro.

Cuando revisé los argumentos en mi programa, se eliminaron todas las comillas dobles. Tienes que reconstituirlos.

Publiqué una solución aquí . Aunque probablemente podría mejorarse con una expresión regular.


1

Tuve un error similar y pensé en responder en caso de que alguien tuviera algo similar. Estaba recorriendo un directorio de archivos json y deserializándolos, pero recibía el mismo error.

El problema era que también intentaba capturar archivos ocultos. Asegúrese de que el archivo que está pasando sea un archivo .json. Supongo que también manejará el texto. Espero que esto ayude.


1

En mi caso, recibí un error en JsonConvert.PopulateObject () . Mi solicitud devolvía JSON que estaba envuelto en un par adicional de corchetes '[]', lo que hace que mi resultado sea una matriz de un objeto en lugar de solo un objeto. Esto es lo que hice para entrar en estos corchetes (solo para ese tipo de modelo):

           T jsonResponse = new T();
                var settings = new JsonSerializerSettings
                {
                    DateParseHandling = DateParseHandling.DateTimeOffset,
                    NullValueHandling = NullValueHandling.Ignore,
                };
                var jRslt = response.Content.ReadAsStringAsync().Result;
                if (jsonResponse.GetType() == typeof(myProject.Models.myModel))
                {
                    var dobj = JsonConvert.DeserializeObject<myModel[]>(jRslt);
                    var y = dobj.First();
                    var szObj = JsonConvert.SerializeObject(y);
                    JsonConvert.PopulateObject(szObj, jsonResponse, settings);
                }
                else
                {
                    JsonConvert.PopulateObject(jRslt, jsonResponse);
                }

1

Si está utilizando la descarga de datos mediante url ... es posible que deba utilizar

var result = client.DownloadData(url);

0

Verifique que el modelo que compartió entre el cliente y el servidor sea el mismo. a veces obtienes este error cuando no actualizaste la versión de Api y devuelve un modelo actualizado, pero aún tienes uno antiguo. A veces, lo que serializa / deserializa no es un JSON válido.


-1

Me enfrenté a un mensaje de error similar en los formularios de Xamarin al enviar una solicitud a webApi para obtener un token,

  • Asegúrese de que todas las claves ( clave : valor) (por ejemplo, 'nombre de usuario', 'contraseña', 'tipo_de_ concesión') en el archivo Json sean exactamente las que esperaba webApi; de lo contrario, activa esta excepción.

Excepción no controlada: Newtonsoft.Json.JsonReaderException: Se encontró un carácter inesperado al analizar el valor: <. Ruta '', línea 0, posición 0


-3

Cuando encontré un problema similar, lo solucioné sustituyendo &mode=xmlpor &mode=jsonen la solicitud.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.