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?
Vous devez l'entourer de crochets, ce qui indique qu'il s'agit d'un tableau:
[{"StaffID":"S01","StaffRank":"Manager"},{"StaffID":"S02","StaffRank":"Waiter"}]
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.