Jak napisać plik JSON w C #?

146

Muszę zapisać następujące dane w pliku tekstowym przy użyciu formatu JSON w C #. Nawiasy są ważne, aby był prawidłowym formatem JSON.

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

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

Oto moja klasa modelu:

public class data
{
    public int Id { get; set; }
    public int SSN { get; set; }
    public string Message { get; set;}
}
user1429595
źródło

Odpowiedzi:

276

Polecam Json.NET , patrz poniższy przykład:

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

Lub nieco wydajniejsza wersja powyższego kodu (nie używa łańcucha jako bufora):

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

Dokumentacja: Serializuj JSON do pliku


Czemu? Oto porównanie funkcji między popularnymi serializatorami, a także testy porównawcze † ‡.

Poniżej znajduje się wykres wydajności zaczerpnięty z połączonego artykułu:

wprowadź opis obrazu tutaj

Ten osobny post stwierdza, że:

Json.NET zawsze wydajnie korzystał z pamięci, przesyłając strumieniowo odczytywanie i pisanie dużych dokumentów zamiast ładowania ich w całości do pamięci, ale udało mi się znaleźć kilka kluczowych miejsc, w których można zmniejszyć alokacje obiektów ...... (teraz) Json.Net (6.0) przydziela 8 razy mniej pamięci niż JavaScriptSerializer


Aktualizacja od .Net Core 3.0

Nowe dziecko w bloku od czasu napisania tego System.Text.Json, zostało dodane do .Net Core 3.0. Microsoft twierdzi, że jest to teraz lepsze niż Newtonsoft . W tym, że jest szybszy niż Newtonsoft . jak wyżej, radzę przetestować to samodzielnie .

† Benchmarki wydają się Json.Net 5, aktualna wersja (w trakcie pisania) to 10. Która wersja standardowych seriali .Net nie została wymieniona

‡ Te testy pochodzą oczywiście od programistów, którzy utrzymują bibliotekę. Nie zweryfikowałem ich twierdzeń . W razie wątpliwości sprawdź je sam.

Liam
źródło
1
Czym różni się JSON.NET od wbudowanej obsługi zapewnianej przez klasy JavaScriptSerializeri DataContractJsonSerializer?
Robert Harvey
2
Link do Json.Net @RobertHarvey Liama ​​zawiera ładną tabelę pokazującą różnice. Pochodząc od ludzi, którzy to robią, oczywiście powinieneś wziąć to z przymrużeniem oka, ale rzeczywiście jest lepszy niż rzeczy wbudowane.
Tim S.
1
Tak, muszę
wielokrotnie dołączać
1
W takim przypadku będziesz musiał odczytać plik, przeanalizować go na obiekty, dodać do obiektów, a następnie ponownie przeanalizować.
Liam,
4
@Drew Noakes Jeśli chcesz pisać do pliku bez umieszczania go najpierw w pamięci, spróbuj tego zapisu z JSON.NET james.newtonking.com/archive/2009/02/14/ ...
gcoleman0828
62

Przykład w odpowiedzi Liama ​​zapisuje plik jako ciąg w jednej linii. Wolę dodawać formatowanie. Ktoś w przyszłości może chcieć ręcznie zmienić jakąś wartość w pliku. Jeśli dodasz formatowanie, będzie to łatwiejsze.

Poniższy tekst dodaje podstawowe wcięcie JSON:

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