Comment écrire un fichier JSON en C #?

146

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 qu'il s'agisse d'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;}
}
user1429595
la source

Réponses:

276

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 une comparaison des fonctionnalités entre les sérialiseurs courants et les tests de référence † ‡.

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

entrez la description de l'image ici

Cet article séparé déclare que:

Json.NET a toujours été efficace en mémoire, diffusant en continu la lecture et l'écriture de gros documents plutôt que de les charger entièrement en 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


Mise à jour depuis .Net Core 3.0

Un nouvel enfant sur le bloc depuis l'écriture de ceci est System.Text.Jsonqui a été ajouté à .Net Core 3.0. Microsoft fait plusieurs déclarations sur le fait que c'est, maintenant, mieux que Newtonsoft . Y compris qu'il est plus rapide que Newtonsoft . comme ci-dessus, je vous conseille de tester cela vous-même .

† Les benchmarks semblent être Json.Net 5, la version actuelle (à l'écriture) est 10. La version des sérialiseurs .Net standard utilisée 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.

Liam
la source
1
En quoi JSON.NET diffère-t-il de la prise en charge intégrée fournie par les classes JavaScriptSerializeret DataContractJsonSerializer?
Robert Harvey
2
Le lien Json.Net de @RobertHarvey Liam a un joli tableau montrant quelles sont les différences. Venant des gens qui le fabriquent, bien sûr, vous devriez le prendre avec un grain de sel, mais c'est en effet mieux que les choses intégrées.
Tim S.
1
Oui, je dois ajouter au fichier encore et encore, mais ils doivent tous être dans le même tableau
user1429595
1
Dans ce cas, vous devrez lire le fichier, l'analyser en objets, l'ajouter aux objets, puis l'analyser à nouveau.
Liam
4
@Drew Noakes Si vous voulez écrire dans un fichier sans le mettre en mémoire d'abord, essayez cette écriture de JSON.NET james.newtonking.com/archive/2009/02/14/…
gcoleman0828
62

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 une mise en forme. Quelqu'un à l'avenir voudra peut-être modifier manuellement une valeur dans le fichier. Si vous ajoutez une mise en forme, il est plus facile de le faire.

Ce qui suit ajoute une indentation JSON de base:

 string json = JsonConvert.SerializeObject(_data.ToArray(), Formatting.Indented);
Michał S.
la source
4
var responseData = //Fetch Data
string jsonData = JsonConvert.SerializeObject(responseData, Formatting.None);
System.IO.File.WriteAllText(Server.MapPath("~/JsonData/jsondata.txt"), jsonData);
Kulwant Singh
la source