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?

zAfLu
la source
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.

Alexei Levenkov
la source
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));
Edu Pelais
la source
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

Brandon Minnick
la source
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)
Alexei
la source
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

Aleksei Mialkin
la source
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);

Praveen
la source
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 () {
        
}
Celso Xavier Luz
la source
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

Hrishikesh TT
la source
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.

JGFMK
la source
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.

Ibaeni
la source
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);
                }
pkucas
la source
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);
Taran
la source
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.

Nalan Madheswaran
la source
-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

A. Almazidi
la source
-3

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

AlfredBauer
la source