Caractère inattendu rencontré lors de l'analyse de la valeur


113

Actuellement, j'ai quelques problèmes. J'utilise C # avec Json.NET. Le problème est que j'obtiens toujours:

{"Caractère inattendu rencontré lors de l'analyse de la valeur: e. Chemin '', ligne 0, position 0."}

Donc, la façon dont j'utilise Json.NET est la suivante. J'ai une classe qui devrait être sauvegardée. La classe ressemble à ceci:

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 objet de cette classe sera rempli et enregistré avec:

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

La partie d'enregistrement fonctionne correctement et le fichier existe et est rempli. Après cela, le fichier sera relu dans la classe avec:

    try 
{ 

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

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

Maintenant sur la ligne courante = vient l'exception:

{"Caractère inattendu rencontré lors de l'analyse de la valeur: e. Chemin '', ligne 0, position 0."}

Je ne sais pas pourquoi cela vient. Le fichier json est le suivant -> Cliquez sur moi dans le lien JSON

Quelqu'un a-t-il une idée?


2
J'ai édité votre titre. Veuillez consulter « Les questions devraient-elles inclure des« balises »dans leurs titres? », Où le consensus est «non, elles ne devraient pas».
John Saunders

Êtes-vous toujours confronté à ce problème, quelles que soient les données? Une fois, lorsque j'ai rencontré un tel problème, la raison était que le service envoyait des caractères UTF-8 invalides.
ankhuri

@JohnSaunders désolé pour ça. le gardera dans le mien pour d'autres questions :).
zAfLu

1
@ankhuri vient d'oublier de lire dans les fichiers ... ma faute
zAfLu

en supposant que ce n'est pas un problème, quoi d'autre? recv Exception-> {"topic": "robot1 / Log", "Msg": "Pilot Running"} Caractère inattendu rencontré lors de l'analyse de la valeur: o. Chemin '', ligne 0, position 0.
Spiked3

Réponses:


149

Vous ne transmettez peut-être pas JSON à DeserializeObject.

Il ressemble à de File.WriteAllText(tmpfile,...ce type de tmpfileest - stringcontenant chemin vers un fichier. JsonConvert.DeserializeObjectprend la valeur JSON, pas le chemin du fichier - donc il échoue en essayant de convertir quelque chose comme @"c:\temp\fooo"- qui n'est clairement pas JSON.


75

J'ai résolu le problème avec ces outils en ligne:

  1. Pour vérifier si la structure Json est OK: http://jsonlint.com/
  2. Pour générer ma classe Object à partir de ma structure Json: https://www.jsonutils.com/

Le code simple:

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

2
Comment check if the Json structure est OKAY en C #?
Kiquenet

1
Peut-être que les réponses ici pourraient vous aider: stackoverflow.com/questions/14977848/…
Edu Pelais

2
Je vous remercie. json2csharp.com a été une bouée de sauvetage pour moi. En l'utilisant, vous pouvez rétroconcevoir à quoi devrait ressembler la classe correcte. Merci encore!
Aamir le

1
Le lien json2csharp.com ne fonctionne plus. Je recommande d'utiliser jsonutils.com à la place.
Stijn

J'ai changé l'url cassée en une nouvelle comme votre suggestion @Stijn.
Edu Pelais le

14

J'ai rencontré la même erreur dans ma solution Xamarin.Android.

J'ai vérifié que mon JSON était correct et j'ai remarqué que l'erreur n'apparaissait que lorsque j'exécutais l'application en tant que version Release.

Il s'est avéré que l'éditeur de liens supprimait une bibliothèque de Newtonsoft.JSON, provoquant une analyse incorrecte du JSON.

J'ai corrigé l'erreur en ajoutant Newtonsoft.Json au paramètre Ignorer les assemblys dans la configuration de construction Android (capture d'écran ci-dessous)

Code d'analyse 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);
    }
}

Capture d'écran de Visual Studio Mac

entrez la description de l'image ici

Capture d'écran de Visual Studio

entrez la description de l'image ici


comment puis-je le faire, sur Visual Studio pour l'application driod xamarin.forms?
Mike Darwish

1
@MikeDarwish J'ai ajouté une capture d'écran montrant comment accomplir cela dans Visual Studio
Brandon Minnick

9

J'ai également rencontré cette erreur pour une action d'API Web (.Net Core 3.0) qui se liait stringplutôt à un objectou à un JObject. Le JSON était correct, mais le classeur a essayé d'obtenir une chaîne de la structure JSON et a échoué.

Donc, au lieu de:

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

J'ai dû utiliser le plus spécifique:

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

Cela m'a fait l'affaire sur .Net Core 2.0, en publiant avec Postman
Vitox le

C'était un casse-tête pour moi aussi, mais cela a du sens car chaque json est une paire clé-valeur et vous devriez fournir une classe avec des propriétés comme clés pour mapper correctement json à une instance de cette classe
Eugene Zakharov

8

Dans mon cas, le fichier contenant la chaîne JSON avait BOM . Une fois que j'ai supprimé la nomenclature, le problème a été résolu.

entrez la description de l'image ici


5

Ce problème est lié à Byte Order Mark dans le fichier JSON. Le fichier JSON n'est pas encodé en tant que données d'encodage UTF8 lorsqu'il est enregistré. Utilisation de File.ReadAllText(pathFile)résoudre ce problème.

Lorsque nous opérons sur des données Byte et que nous les convertissons en chaîne, puis que nous les transmettons à JsonConvert.DeserializeObject, nous pouvons utiliser le codage UTF32 pour obtenir la chaîne.

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

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


3

J'ai eu le même problème avec webapi dans ASP.NET core, dans mon cas, c'était parce que mon application a besoin d'une authentification, puis elle attribue l'annotation [AllowAnonymous]et cela a fonctionné.

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

Je suis en retard à la fête à ce sujet, mais c'était aussi mon problème. En examinant le "json" entrant dans ma méthode Deserialize, il a montré qu'il essayait de s'authentifier avec l'API.
Ben

1

Supposons que ce soit votre json

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

si vous voulez à nouveau désérialiser le lieu, modifiez json comme ci-dessous

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

puis essayez de désérialiser en classe respective en prenant la valeur de lieu


1
Salut, j'utilise JsonConvert.SerializeObject, qui produira le premier résultat de moi, comment puis-je obtenir le second?
user123456

Cela ne répond pas à la question qui a été posée.
Brian Rogers

1

Dans mon scénario, j'avais un message légèrement différent, où la ligne et la position n'étaient pas nulles.

E. Chemin «job [0] .name», ligne 1, position 12.

C'était la meilleure réponse de Google pour le message que j'ai cité.

Cela est arrivé parce que j'avais appelé un programme à partir de la ligne de commande Windows, en passant JSON en tant que paramètre.

Lorsque j'ai examiné les arguments de mon programme, tous les guillemets doubles ont été supprimés. Vous devez les reconstituer.

J'ai posté une solution ici . Bien qu'il puisse probablement être amélioré avec un Regex.


1

J'ai eu une erreur similaire et j'ai pensé que je répondrais au cas où quelqu'un aurait quelque chose de similaire. J'étais en boucle sur un répertoire de fichiers json et je les désérialisais, mais j'obtenais la même erreur.

Le problème était qu'il essayait également de récupérer des fichiers cachés. Assurez-vous que le fichier que vous transmettez est un fichier .json. Je suppose que cela gérera également le texte. J'espère que cela t'aides.


1

Dans mon cas, j'obtenais une erreur sur JsonConvert.PopulateObject () . Ma demande retournait JSON qui était enveloppé dans une paire supplémentaire de crochets '[]', faisant de mon résultat un tableau d'un objet plutôt qu'un simple objet. Voici ce que j'ai fait pour entrer dans ces crochets (uniquement pour ce type de modèle):

           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 vous utilisez le téléchargement de données à l'aide de l'URL ... vous devrez peut-être utiliser

var result = client.DownloadData(url);

0

Veuillez vérifier que le modèle que vous avez partagé entre le client et le serveur est le même. parfois, vous obtenez cette erreur lorsque vous n'avez pas mis à jour la version de l'API et qu'elle renvoie un modèle mis à jour, mais que vous en avez toujours un ancien. Parfois, vous obtenez ce que vous sérialisez / désérialisez n'est pas un JSON valide.


-1

J'ai rencontré un message d'erreur similaire dans les formulaires Xamarin lors de l'envoi d'une demande à webApi pour obtenir un jeton,

  • Assurez-vous que toutes les clés ( clé : valeur) (ex. 'Nom d'utilisateur', 'mot de passe', 'grant_type') dans le fichier Json sont exactement ce que le webApi attend, sinon il déclenche cette exception.

Exception non gérée: Newtonsoft.Json.JsonReaderException: caractère inattendu rencontré lors de l'analyse de la valeur: <. Chemin '', ligne 0, position 0


-3

Quand je rencontrais un problème similaire, je l' ai fixé en substituant &mode=xmlà &mode=jsonla demande.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.