web-dev-qa-db-fra.com

Texte supplémentaire rencontré après avoir fini de lire le contenu JSON:

J'ai des problèmes avec create avec JSON.Net. Lorsque j'essaie de l'analyser, cela me donne l'erreur suivante:

Texte supplémentaire rencontré après avoir fini de lire le contenu JSON:

J'ai essayé de le valider avec http://json.parser.online.fr/ et il dit "SyntaxError: jeton inattendu".

Mon JSON est comme ci-dessous:

{"StaffID":"S01","StaffRank":"Manager"},{"StaffID":"S02","StaffRank":"Waiter"}

Comment le désérialiser?

19
Howard Hee

Vous devez l'entourer de crochets, ce qui indique qu'il s'agit d'un tableau:

    [{"StaffID":"S01","StaffRank":"Manager"},{"StaffID":"S02","StaffRank":"Waiter"}]
25
Kevin Schmid

Depuis version 11.0.1 , Json.NET prend désormais en charge nativement l'analyse JSON délimitée par des virgules de la même manière qu'il prend en charge l'analyse JSON délimité par des sauts de ligne :

Nouvelle fonctionnalité - Ajout de la prise en charge de la lecture de plusieurs valeurs séparées par des virgules avec JsonReader.SupportMultipleContent .

Ainsi, la réponse à sérialisation et désérialisation json délimitées par des lignes par Yuval Itzchakov devrait également fonctionner ici. Définissez une méthode d'extension:

public static partial class JsonExtensions
{
    public static IEnumerable<T> FromDelimitedJson<T>(TextReader reader, JsonSerializerSettings settings = null)
    {
        using (var jsonReader = new JsonTextReader(reader) { CloseInput = false, SupportMultipleContent = true })
        {
            var serializer = JsonSerializer.CreateDefault(settings);

            while (jsonReader.Read())
            {
                if (jsonReader.TokenType == JsonToken.Comment)
                    continue;
                yield return serializer.Deserialize<T>(jsonReader);
            }
        }
    }
}

Puis, étant donné un modèle de données créé pour contenir un élément individuel dans la liste séparée par des virgules, comme:

public class RootObject
{
    public string StaffID { get; set; }
    public string StaffRank { get; set; }
}

Vous pouvez désérialiser la chaîne JSON présentée comme suit:

var jsonString = @"{""StaffID"":""S01"",""StaffRank"":""Manager""},{""StaffID"":""S02"",""StaffRank"":""Waiter""}";

var list = JsonExtensions.FromDelimitedJson<RootObject>(new StringReader(jsonString)).ToList();

Cette approche peut être préférable lors de la désérialisation d'une très grande séquence d'objets délimités par des virgules à partir d'un fichier volumineux, car il n'est pas nécessaire de charger l'intégralité du fichier dans un string puis d'ajouter '[' Et ']' Au début et à la fin. Dans Conseils de performance: Optimiser l'utilisation de la mémoire Newtonsoft recommande de désérialiser les fichiers volumineux directement à partir d'un flux, donc à la place un StreamReader peut être passé dans JsonExtensions.FromDelimitedJson() qui sera ensuite diffusé à travers le fichier désérialisant chaque objet séparément.

2
dbc