Hoe schrijf ik een JSON-bestand in C#?

Ik moet de volgende gegevens in een tekstbestand schrijven in JSON-indeling in C#. De haakjes zijn belangrijk voor een geldig JSON-formaat.

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

Hier is mijn modelklasse:

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

Antwoord 1, autoriteit 100%

Update 2020:het is 7 jaar geleden dat ik dit antwoord schreef. Het lijkt nog steeds veel aandacht te krijgen. In 2013 was Newtonsoft Json.Net HET antwoord op dit probleem. Nu is het nog steeds een goed antwoord op dit probleem, maar het is niet langer de enige haalbare optie. Om wat up-to-date voorbehoud aan dit antwoord toe te voegen:

  • .Net Core heeft nu de spookachtig vergelijkbare System.Text.Jsonserializer (zie hieronder)
  • De dagen van de JavaScriptSerializerzijn gelukkig geslaagd en deze klasse zit niet eens in .Net Core. Dit maakt veel van de vergelijkingen van Newtonsoft ongeldig.
  • Het is me onlangs ook opgevallen dat Json.Net al enige tijd geen update heeft gehad via software voor het scannen van kwetsbaarheden die we in het werk gebruiken. Updates in 2020 zijn opgedroogden de nieuwste versie, 12.0.3, is afgelopen een jaar oud (2021).
  • De snelheidstests(eerder hieronder geciteerdmaar nu verwijderd omdat ze zo verouderd zijn dat ze irrelevant lijken) vergelijken een oudere versie van Json.Net (versie 6.0 en zoals ik al zei de nieuwste is 12.0.3) met een verouderde .Net Frameworkserializer.
  • Een voordeel van de System.Text.Json-serializer ten opzichte van Newtonsoft is de ondersteuning voor async/await

Zijn de dagen van Json.Net geteld? Het wordt nog steeds VEEL gebruikt en het wordt nog steeds gebruikt door MS-bibliotheken. Dus waarschijnlijk niet. Maar dit voelt als het begin van het einde voor deze bibliotheek die misschien gewoon zijn gang gaat.


.Net Core 3.0+ en .Net 5

Een nieuw kind in de buurt sinds het schrijven van dit is System.Text.Jsondie is toegevoegd aan .Net Core 3.0. Microsoft maakt verschillende beweringen dat dit nu beter is dan Newtonsoft. Waaronder dat het sneller is dan Newtonsoft. Ik raad je aan dit zelf te testen .

Voorbeelden:

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

of

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

Documentatie


Newtonsoft Json.Net (.Net-framework en .Net Core)

Een andere optie is Json.Net, zie voorbeeld hieronder:

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

Of de iets efficiëntere versie van de bovenstaande code (gebruikt geen string als 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);
}

Documentatie: JSON serialiseren naar een bestand


Antwoord 2, autoriteit 21%

Het voorbeeld in Liam’s antwoord slaat het bestand op als string in een enkele regel. Ik geef er de voorkeur aan om opmaak toe te voegen. Iemand in de toekomst wil misschien een waarde handmatig in het bestand wijzigen. Als u opmaak toevoegt, is dit gemakkelijker te doen.

Het volgende voegt elementaire JSON-inspringing toe:

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

Antwoord 3, autoriteit 2%

Er is hiervoor ingebouwde functionaliteit met behulp van de JavaScriptSerializer-klasse:

var json = JavaScriptSerializer.Serialize(data);

Antwoord 4

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

Other episodes