Communauté

Lecture de fichier ...
 
Notifications
Retirer tout

Lecture de fichier json en c#, sans lib à la main

17 Posts
2 Utilisateurs
1 Likes
960 Vu
(@oblerion)
Trusted Member
Inscription: Il y a 7 ans
Posts: 45
Début du sujet  

Lecture de json

Chez moi l'exemple dans les cours d'utilisation de json n'a jamais fonctionner.

Les recherche sur le net et les forums n'ont pas été plus concluante.
J'ai donc du créer une classe qui permet une lecture de fichier simple et de récupérer les valeurs sur des variables.

Les types de retour supporter son string, int et float.

Les besoins:

  • lire un fichier texte.
  • filtrer les espaces, saut de ligne et tabulation de la lecture.
  • extraire un string d'un autre string avec un caractère de debut et de fin.
  • extraire un string d'un autre string avec uniquement le caractère de début.
  • conversion de string en int.
  • conversion de string en float.

 

 


   
Citation
Étiquettes du sujet
(@oblerion)
Trusted Member
Inscription: Il y a 7 ans
Posts: 45
Début du sujet  

1) Lecture et filtrage

using System.IO;

// lecture 
StreamReader file = File.OpenText("file.json");
string reading = file.ReadToEnd();

// filtre 
string filter_out="";
for(int i=0;i<reading.Length;i++)
{
  if(reading[i]!=' ' || reading[i]!='\n' || reading[i]!='\b')
  {
    filter_out+=reading[i];
  }
}

   
RépondreCitation
(@oblerion)
Trusted Member
Inscription: Il y a 7 ans
Posts: 45
Début du sujet  

2) Lecture ligne par ligne entre crochet

int i_tps = -1;// position de la ligne
for(int i=0;i<filter_out.Length;i++)
{
   if(filter_out[i]=='{')
   {// enregistrement position du premier crochet
      i_tps = i+1;
   }
   else if(filter_out[i]==',' || filter_out[i]=='}')
   {// detection de la fin ligne
      string line = filter_out.Substring(i_tps,i-i_tps);
      //
      // récupèration de la ligne
      //
      i_tps = i+1;
    }
}

   
RépondreCitation
(@oblerion)
Trusted Member
Inscription: Il y a 7 ans
Posts: 45
Début du sujet  

3) Extraction d'un string avec char debut et fin

// variables d'entrée //
// string dont on extraire un string
string s_input;

//char du début de l'extraction
char cbegin;

//char de fin d'extraction
char cend;

// variables de sortie //
// string extrait
string s_out="";

int i_beg=-1; // position du 1er char
int i_end=-1; // position du 2eme char
for(int i=0;i<s_input.Length;i++)
{
   if(i_beg==-1 && s_out[i]==cbegin) i_beg = i+1;
   else if(i_beg>-1 && s_input[i]==cend)
   {
       i_end = i;
       break;
    }
}
if(i_beg+i_end>0 && i_end-i_beg <= s_input.Length)
{
    s_out = s_input.Substring(i_beg,i_end-i_beg);
}

   
RépondreCitation
(@oblerion)
Trusted Member
Inscription: Il y a 7 ans
Posts: 45
Début du sujet  

4) Extraction d'un string a partir d'un char de début

// variables d'entrée //
// string dont on extraire un string
string s_input;

//char du début de l'extraction
char cbegin;

// variables de sortie //
// string extrait
string s_out="";

int i_beg=-1;// position du char

for(int i=0;i<s_input.Length;i++)
{
	if(i_beg==-1 && s_input[i]==cbegin) i_beg = i+1;
}
if(i_beg+i_end>0 && i_end-i_beg <= s_input.Length) 
{
       s_out = s_input.Substring(i_beg,s_input.Length-i_beg);
}

   
RépondreCitation
(@oblerion)
Trusted Member
Inscription: Il y a 7 ans
Posts: 45
Début du sujet  

5) Conversion string -> int, float

string str;

// string ver int
int n_int = Int32.Parse(str);

// string ver float
float n_float = float.Parse(str);

   
RépondreCitation
(@oblerion)
Trusted Member
Inscription: Il y a 7 ans
Posts: 45
Début du sujet  

version complète du code ici gist.github.com/oblerion/JsonObject.cs


   
RépondreCitation
(@david)
Membre Admin
Inscription: Il y a 8 ans
Posts: 153
 

Oui le cours en question était obsolète, il y a maintenant :

using System.Text.Json;

Et j'ai montré la nouvelle méthode pendant les cours de certification. Voilà l'exemple qu'on avait fait ensemble :

// Ecriture
Level levelTest = new Level();

Random random = new Random();
levelTest.Name = "Level 1";
levelTest.Description = "Ceci est le niveau 1 du jeu";
levelTest.Map = new int[10][];
for (int l = 0; l < 10; l++)
{
    levelTest.Map[l] = new int[10];
    for (int c = 0; c < 10; c++)
    {
        levelTest.Map[l][c] = random.Next(0, 10 + 1);
    }
}
Trace.WriteLine("Level instancié");

string jsonString = JsonSerializer.Serialize(levelTest);

File.WriteAllText("Level.json", jsonString);


// Lecture
string jsonString = File.ReadAllText("Level.json");
Level levelTest = JsonSerializer.Deserialize<Level>(jsonString);

   
RépondreCitation
(@oblerion)
Trusted Member
Inscription: Il y a 7 ans
Posts: 45
Début du sujet  

@david Cette méthode ne fonctionne pas non plus, c'est pour ça que j'ai utiliser du texte au lieu du json dans le projet c#/monogame.
Je trouve que ma classe plus simple à utiliser même si elle reste limité.

De plus c'est assez instructif de créer ce genre d'outils, c'est les bases pour créer ses propres format de donnée


   
RépondreCitation
(@david)
Membre Admin
Inscription: Il y a 8 ans
Posts: 153
 

@oblerion oui c'est instructif mais très limité, à la limite autant faire un .INI, et aucune raison que le JSON officiel ne marche pas, il faudrait explorer. Ne pas oublier de passer les membres de la classe que tu veux sérialiser en propriétés pour que la réflexivité soit possible.


   
RépondreCitation
(@oblerion)
Trusted Member
Inscription: Il y a 7 ans
Posts: 45
Début du sujet  
Posté par: @oblerion

version complète du code ici gist.github.com/oblerion/JsonObject.cs

nouvelle page github ici github.com/oblerion/JsonObject


   
RépondreCitation
(@oblerion)
Trusted Member
Inscription: Il y a 7 ans
Posts: 45
Début du sujet  
Les erreurs du filtre ont été corrigé, 
La partie de lecture allégée.
L'ajout de la lecture de string entre "",
détection [] et {} qui empêche l’arrêt de la lecture à la première }.
Mais pas encore de gestion des floats, objects et array.

   
RépondreCitation
(@oblerion)
Trusted Member
Inscription: Il y a 7 ans
Posts: 45
Début du sujet  

Ajout de la lecture de float.
Publication de la version 0.1-1.
v0.1-1


   
RépondreCitation
(@oblerion)
Trusted Member
Inscription: Il y a 7 ans
Posts: 45
Début du sujet  

Conversion du type au début de la lecture, au lieu de la fin.
Ajout de la lecture récursive d'objet indexer.

Version 0.2 publier
version 0.2


   
caprog reacted
RépondreCitation
(@oblerion)
Trusted Member
Inscription: Il y a 7 ans
Posts: 45
Début du sujet  

Ajout

  • lecture de bool
  • méthode IsEmpty() retourne à bool si objet est vide ou si le fichier n'existe pas
  • renommage des méthodes pour qu'elle commence par une majuscule

version 0.2-1 publier

https://github.com/oblerion/JsonObject.cs/releases/tag/0.2-1


   
RépondreCitation
Page 1 / 2
Share:

Dialoguez avec les autres membres de la gamecodeur school.

Accédez maintenant à notre serveur Discord privé : Entraide, Game Jams, Partage de projets, etc.

Vous devez être membre de la Gamecodeur School Premium pour être autorisé à accéder au serveur.