web-dev-qa-db-fra.com

Comment écrire un fichier JSON en C #?

J'ai besoin d'écrire les données suivantes dans un fichier texte en utilisant le format JSON en C #. Les crochets sont importants pour que ce soit un format JSON valide.

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

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

Voici ma classe de modèle:

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

Je recommanderais 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 (n'utilise pas de chaîne 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érialiser JSON dans un fichier


Pourquoi? Voici un comparaison des fonctionnalités entre les sérialiseurs courants et les tests de référence † ‡.

Vous trouverez ci-dessous un graphique des performances tiré de l'article lié:

enter image description here

Ceci article séparé , déclare que:

Json.NET a toujours été efficace en mémoire, transmettant en continu la lecture et l’écriture de documents volumineux plutôt que de les charger entièrement dans la mémoire, mais j’ai pu trouver quelques endroits clés où les allocations d’objets pourraient être réduites ...... (maintenant) Json.Net (6.0) alloue 8 fois moins de mémoire que JavaScriptSerializer

‡.

† Les repères semblent être Json.Net 5, la version actuelle (en écriture) est 10. Quelle version des serialisers .Net standard utilisés n'est pas mentionnée

‡ Ces tests proviennent évidemment des développeurs qui gèrent la bibliothèque. Je n'ai pas vérifié leurs affirmations . En cas de doute, testez-les vous-même.

229
Liam

L'exemple de la réponse de Liam enregistre le fichier sous forme de chaîne sur une seule ligne. Je préfère ajouter le formatage. Quelqu'un dans le futur voudra peut-être changer une valeur manuellement dans le fichier. Si vous ajoutez une mise en forme, c'est plus facile.

Les éléments suivants ajoutent une indentation JSON de base:

 string json = JsonConvert.SerializeObject(_data.ToArray(), Formatting.Indented);
53
Michał S.

Il existe une fonctionnalité intégrée pour cela en utilisant JavaScriptSerializer Class :

var json = JavaScriptSerializer.Serialize(data);
7
Gabe
var responseData = //Fetch Data
string jsonData = JsonConvert.SerializeObject(responseData, Formatting.None);
System.IO.File.WriteAllText(Server.MapPath("~/JsonData/jsondata.txt"), jsonData);
4
Kulwant Singh