Come scrivere un file JSON in C #?


146

Devo scrivere i seguenti dati in un file di testo usando il formato JSON in C #. Le parentesi sono importanti perché sia ​​un formato JSON valido.

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

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

Ecco la mia classe di modello:

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

Risposte:


276

Consiglierei Json.Net , vedi esempio sotto:

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);

O la versione leggermente più efficiente del codice sopra (non usa una stringa come buffer):

//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);
}

Documentazione: serializzare JSON su un file


Perché? Ecco un confronto delle caratteristiche tra i comuni serializzatori e i test benchmark † ‡.

Di seguito è riportato un grafico delle prestazioni tratto dall'articolo collegato:

inserisci qui la descrizione dell'immagine

Questo post separato afferma che:

Json.NET è sempre stato efficiente in termini di memoria, eseguendo lo streaming della lettura e della scrittura di documenti di grandi dimensioni anziché caricarli interamente in memoria, ma sono stato in grado di trovare un paio di posizioni chiave in cui le allocazioni degli oggetti potrebbero essere ridotte ...... (ora) Json.Net (6.0) alloca 8 volte meno memoria rispetto a JavaScriptSerializer


Aggiornamento da .Net Core 3.0

Un nuovo bambino sul blocco da quando è System.Text.Jsonstato scritto questo è stato aggiunto a .Net Core 3.0. Microsoft fa diverse affermazioni su come ora sia meglio di Newtonsoft . Compreso che è più veloce di Newtonsoft . come sopra, ti consiglio di provare questo .

† I benchmark sembrano essere Json.Net 5, la versione corrente (per iscritto) è 10. Quale versione dei serializzatori .Net standard utilizzati non è menzionata

‡ Questi test provengono ovviamente dagli sviluppatori che gestiscono la libreria. Non ho verificato i loro reclami . In caso di dubbio, provali tu stesso.


1
In che modo JSON.NET differisce dal supporto integrato fornito dalle classi JavaScriptSerializere DataContractJsonSerializer?
Robert Harvey,

2
@RobertHarvey Il link Json.Net di Liam ha una bella tabella che mostra quali sono le differenze. Proveniente dalle persone che lo producono, ovviamente dovresti prenderlo con un granello di sale, ma è davvero meglio delle cose incorporate.
Tim S.

1
Sì, devo aggiungere ripetutamente il file, ma devono essere tutti nello stesso array
user1429595

1
In tal caso dovrai leggere il file, analizzarlo in oggetti, aggiungerlo agli oggetti, quindi analizzarlo nuovamente.
Liam,

4
@Drew Noakes Se vuoi scrivere su un file senza prima metterlo in memoria, prova a scrivere da JSON.NET james.newtonking.com/archive/2009/02/14/…
gcoleman0828,

62

L'esempio nella risposta di Liam salva il file come stringa in una singola riga. Preferisco aggiungere la formattazione. Qualcuno in futuro potrebbe voler modificare manualmente un valore nel file. Se aggiungi la formattazione è più facile farlo.

Quanto segue aggiunge il rientro JSON di base:

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


4
var responseData = //Fetch Data
string jsonData = JsonConvert.SerializeObject(responseData, Formatting.None);
System.IO.File.WriteAllText(Server.MapPath("~/JsonData/jsondata.txt"), jsonData);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.