192 votes

Comment écrire un fichier JSON en C# ?

Je dois écrire les données suivantes dans un fichier texte en utilisant le format JSON en C#. Les parenthèses sont importantes pour que le format JSON soit valide.

[
  {
    "Id": 1,
    "SSN": 123,
    "Message": "whatever"

  },
  {
   "Id": 2,
    "SSN": 125,
    "Message": "whatever"
  }
]

Voici ma classe modèle :

public class data
{
    public int Id { get; set; }
    public int SSN { get; set; }
    public string Message { get; set;}
}

382voto

Liam Points 5802

Mise à jour 2020 : Cela fait 7 ans que j'ai écrit cette réponse. Elle semble toujours susciter beaucoup d'attention. En 2013, Newtonsoft Json.Net était LA réponse à ce problème. Maintenant, c'est toujours une une bonne réponse à ce problème, mais ce n'est plus la seule option viable. . Pour ajouter quelques mises en garde actualisées à cette réponse :

  • .Net Core dispose maintenant de l'effroyablement similaire System.Text.Json sérialiseur (voir ci-dessous)
  • Les jours de la JavaScriptSerializer sont heureusement passées et cette classe n'est même pas dans .Net Core. Cela invalide une grande partie des comparaisons effectuées par Newtonsoft.
  • J'ai également appris récemment, par le biais d'un logiciel d'analyse des vulnérabilités que nous utilisons au travail, que Json.Net n'avait pas été mis à jour depuis un certain temps. Les mises à jour en 2020 se sont taries et la dernière version, 12.0.3, a plus d'un an (2021).
  • El tests de vitesse ( précédemment cité ci-dessous mais qui ont été retirés car ils sont tellement dépassés qu'ils ne semblent pas pertinents) comparent une ancienne version de Json.Net (version 6.0 et, comme je l'ai dit, la plus récente est 12.0.3 ) avec une version obsolète de .Net Cadre de travail sérialiseur.
  • Un avantage que le System.Text.Json sérialiseur par rapport à Newtonsoft est la prise en charge des éléments suivants async / await

Les jours de Json.Net sont-ils comptés ? Il est encore beaucoup utilisé et il est encore utilisé par les bibliothèques MS. Donc probablement pas. Mais cela ressemble au début de la fin pour cette bibliothèque qui pourrait bien avoir suivi son cours.


.Net Core 3.0+ et .Net 5

Un nouveau venu dans le quartier depuis la rédaction de cet article est System.Text.Json qui a été ajouté à .Net Core 3.0. Microsoft affirme à plusieurs reprises que ce logiciel est désormais meilleur que Newtonsoft. . Y compris que c'est plus rapide que Newtonsoft . Je vous conseille de le tester vous-même .

Exemples :

using System.Text.Json;
using System.Text.Json.Serialization;

List<data> _data = new List<data>();
_data.Add(new data()
{
    Id = 1,
    SSN = 2,
    Message = "A Message"
});

string json = JsonSerializer.Serialize(_data);
File.WriteAllText(@"D:\path.json", json);

ou

using System.Text.Json;
using System.Text.Json.Serialization;

List<data> _data = new List<data>();
_data.Add(new data()
{
    Id = 1,
    SSN = 2,
    Message = "A Message"
});

await using FileStream createStream = File.Create(@"D:\path.json");
await JsonSerializer.SerializeAsync(createStream, _data);

Documentation


Newtonsoft Json.Net (.Net framework et .Net Core)

Une autre option est Json.Net voir l'exemple ci-dessous :

List<data> _data = new List<data>();
_data.Add(new data()
{
    Id = 1,
    SSN = 2,
    Message = "A Message"
});

string json = JsonConvert.SerializeObject(_data.ToArray());

//write string to file
System.IO.File.WriteAllText(@"D:\path.txt", json);

Ou la version légèrement plus efficace du code ci-dessus (qui n'utilise pas une chaîne de caractères comme tampon) :

//open file stream
using (StreamWriter file = File.CreateText(@"D:\path.txt"))
{
     JsonSerializer serializer = new JsonSerializer();
     //serialize object directly into file stream
     serializer.Serialize(file, _data);
}

Documentation : Sérialisation de JSON vers un fichier

77voto

Michał S. Points 73

L'exemple dans la réponse de Liam enregistre le fichier en tant que chaîne de caractères sur une seule ligne. Je préfère ajouter le formatage. Dans le futur, quelqu'un pourrait vouloir modifier manuellement une valeur dans le fichier. Si vous ajoutez un formatage, il sera plus facile de le faire.

Le texte suivant ajoute une indentation JSON de base :

 string json = JsonConvert.SerializeObject(_data.ToArray(), Formatting.Indented);

8voto

Gabe Points 24378

Il existe une fonctionnalité intégrée pour cela, qui utilise la fonction Classe JavaScriptSerializer :

var json = JavaScriptSerializer.Serialize(data);

5voto

Kulwant Singh Points 61
var responseData = //Fetch Data
string jsonData = JsonConvert.SerializeObject(responseData, Formatting.None);
System.IO.File.WriteAllText(Server.MapPath("~/JsonData/jsondata.txt"), jsonData);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X