Wie schreibe ich eine JSON-Datei in C #?

145

Ich muss die folgenden Daten im JSON-Format in C # in eine Textdatei schreiben. Die Klammern sind wichtig, damit das JSON-Format gültig ist.

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

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

Hier ist meine Modellklasse:

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

Antworten:

274

Ich würde Json.Net empfehlen , siehe Beispiel unten:

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

Oder die etwas effizientere Version des obigen Codes (verwendet keine Zeichenfolge als Puffer):

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

Dokumentation: Serialisieren Sie JSON in eine Datei


Warum? Hier ist ein Funktionsvergleich zwischen gängigen Serialisierern sowie Benchmark-Tests † ‡.

Unten finden Sie eine grafische Darstellung der Leistung aus dem verlinkten Artikel:

Geben Sie hier die Bildbeschreibung ein

In diesem separaten Beitrag heißt es:

Json.NET war schon immer speichereffizient und hat das Lesen und Schreiben großer Dokumente gestreamt, anstatt sie vollständig in den Speicher zu laden. Ich konnte jedoch einige wichtige Stellen finden, an denen die Objektzuweisungen reduziert werden konnten ...... (jetzt) Json.Net (6.0) reserviert 8-mal weniger Speicher als JavaScriptSerializer


Update seit .Net Core 3.0

Ein neues Kind auf dem Block seit dem Schreiben dieses System.Text.JsonArtikels wurde zu .Net Core 3.0 hinzugefügt. Microsoft macht mehrere Behauptungen, dass dies jetzt besser ist als Newtonsoft . Einschließlich, dass es schneller als Newtonsoft ist . Wie oben würde ich Ihnen raten, dies selbst zu testen .

† Benchmarks scheinen Json.Net 5 zu sein, die aktuelle Version (beim Schreiben) ist 10. Welche Version der verwendeten Standard-.Net-Serialisierer verwendet wird, wird nicht erwähnt

‡ Diese Tests stammen offensichtlich von den Entwicklern, die die Bibliothek verwalten. Ich habe ihre Behauptungen nicht überprüft . Im Zweifelsfall testen Sie sie selbst.

Liam
quelle
1
Wie unterscheidet sich JSON.NET von der integrierten Unterstützung durch die Klassen JavaScriptSerializerund DataContractJsonSerializer?
Robert Harvey
2
@RobertHarvey Liams Json.Net-Link enthält eine schöne Tabelle mit den Unterschieden. Wenn man von den Leuten kommt, die es herstellen, sollte man es natürlich mit einem Körnchen Salz nehmen, aber es ist in der Tat besser als die eingebauten Dinge.
Tim S.
1
Ja, ich muss immer wieder an die Datei
anhängen
1
In diesem Fall müssen Sie die Datei lesen, in Objekte analysieren, zu den Objekten hinzufügen und dann wieder analysieren.
Liam
4
@Drew Noakes Wenn Sie in eine Datei schreiben möchten, ohne sie zuerst in den Speicher zu stellen, versuchen Sie dies aus JSON.NET james.newtonking.com/archive/2009/02/14/…
gcoleman0828
61

Das Beispiel in Liams Antwort speichert die Datei als Zeichenfolge in einer einzelnen Zeile. Ich ziehe es vor, Formatierungen hinzuzufügen. Jemand in der Zukunft möchte möglicherweise einen Wert manuell in der Datei ändern. Wenn Sie eine Formatierung hinzufügen, ist dies einfacher.

Im Folgenden wird die grundlegende JSON-Einrückung hinzugefügt:

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