Lecture d’objects JSON à partir d’un fichier volumineux

Je recherche un parsingur JSON pouvant me permettre de parcourir les objects JSON à partir d’un fichier JSON volumineux (dont la taille est inférieure à plusieurs centaines de Mo). J’ai essayé JsonTextReader de Json.NET comme ci-dessous:

JsonTextReader reader = new JsonTextReader(new SsortingngReader(json)); while (reader.Read()) { if (reader.Value != null) Console.WriteLine("Token: {0}, Value: {1}", reader.TokenType, reader.Value); else Console.WriteLine("Token: {0}", reader.TokenType); } 

Mais il retourne jeton après jeton.
Existe-t-il un moyen plus simple si j’ai besoin d’un object entier au lieu de jetons?

Supposons que vous avez un tableau JSON semblable à ceci:

 [{"text":"0"},{"text":"1"}......] 

Je vais déclarer une classe pour le type d’object

 public class TempClass { public ssortingng text; } 

Maintenant, la partie de désérialisation

 JsonSerializer ser = new JsonSerializer(); ser.Converters.Add(new DummyConverter(t => { //A callback method Console.WriteLine(t.text); })); ser.Deserialize(new JsonTextReader(new StreamReader(File.OpenRead(fName))), typeof(List)); 

Et une classe factice JsonConverter pour intercepter la désérialisation

 public class DummyConverter : JsonConverter { Action _action = null; public DummyConverter(Action action) { _action = action; } public override bool CanConvert(Type objectType) { return objectType == typeof(TempClass); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { serializer.Converters.Remove(this); T item = serializer.Deserialize(reader); _action( item); return null; } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotImplementedException(); } } 

Je voudrais utiliser cette bibliothèque JSON.net . La commande pour Nuget est la suivante -> Install-Package Newtonsoft.Json

C’est l’un des cas d’utilisation que j’ai envisagé pour mon propre parsingur / désérialiseur.

J’ai récemment fait un exemple simple (en alimentant l’parsingur avec du texte JSON lu via un StreamReader) de désérialiser cette forme JSON:

 { "fathers" : [ { "id" : 0, "married" : true, "name" : "John Lee", "sons" : [ { "age" : 15, "name" : "Ronald" } ], "daughters" : [ { "age" : 7, "name" : "Amy" }, { "age" : 29, "name" : "Carol" }, { "age" : 14, "name" : "Barbara" } ] }, { "id" : 1, "married" : false, "name" : "Kenneth Gonzalez", "sons" : [ ], "daughters" : [ ] }, { "id" : 2, "married" : false, "name" : "Larry Lee", "sons" : [ { "age" : 4, "name" : "Anthony" }, { "age" : 2, "name" : "Donald" } ], "daughters" : [ { "age" : 7, "name" : "Elizabeth" }, { "age" : 15, "name" : "Betty" } ] }, //(... etc) ] } 

… dans ces POCO:

https://github.com/ysharplanguage/FastJsonParser#POCOs

(c.-à-d. spécifiquement: “FathersData”, “Père”, “Fils”, “Fille”)

Cet échantillon présente également:

(1) un exemple de filtre sur l’index d’élément relatif du tableau Father [] (par exemple, pour n’extraire que les 10 premiers), et

(2) comment peupler de manière dynamic une propriété des filles du père lorsque la désérialisation de leur père respectif est renvoyée – (c’est-à-dire, grâce à un délégué que l’appelant transmet à la méthode Parse de l’parsingur, à des fins de rappel).

Pour le rest des bits, voir:

ParserTests.cs: void statique FilteredFatherStreamTestDaughterMaidenNamesFixup ()

(lignes # 829 à # 904 )

La performance que j’observe sur mon humble ordinateur portable (*) pour l’parsing de fichiers JSON d’environ 12 Mo à environ 180 Mo et la désérialisation d’un sous-ensemble arbitraire de leur contenu en fichiers POCO

(ou dans des dictionnaires faiblement typés (juste des paires clé / valeur (chaîne, object)) également supscopes)

est partout dans le stade de ~ 20 Mo / sec à 40 Mo / sec (**).

(par exemple, environ 300 millisecondes dans le cas du fichier JSON de 12 Mo, en fichiers POCO)

Plus d’informations détaillées disponibles ici:

https://github.com/ysharplanguage/FastJsonParser#Performance

‘HTH,

(*) (sous Win7 64bit @ 2.5Ghz)

(**) (le débit dépend assez de la forme / de la complexité JSON en entrée, par exemple la profondeur d’imbrication des sous-objects et d’autres facteurs)