Jak napisać plik Json w C#?

Cześć muszę zapisać następujące dane do pliku tekstowego przy użyciu formatu Json w C#? Nawiasy są ważne, aby były poprawne w formacie JSON

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

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

A oto moja klasa modelek

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

}
Author: Kiquenet, 2013-06-04

4 answers

Polecam Json.Net, patrz przykład poniżej:

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 bardziej efektywna 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: Serializowanie JSON do pliku


Dlaczego? Oto Porównanie funkcji między popularnymi serializerami, a także testy porównawcze .

Poniżej wykres wydajności zaczerpnięty z linkowanego artykułu:

Tutaj wpisz opis obrazka

To oddzielny post , stwierdza, że:

Json.NET zawsze był wydajny w pamięci, przesyłając strumieniowo odczyt i zapis dużych dokumentów, a nie ładując je całkowicie do pamięci, ale udało mi się znaleźć kilka kluczowych miejsc, w których alokacje obiektów mogłyby zostać zmniejszone...... (teraz) Json.Net (6.0) przydziela 8 razy mniej pamięci niż JavaScriptSerializer

.

Benchmarki wydają się być Json.Net 5, aktualna wersja (na piśmie) jest 10. Jaka wersja standardowych seriali. Net nie jest wymieniona

te testy pochodzą oczywiście od programistów, którzy obsługują bibliotekę. nie zweryfikowałem ich twierdzeń . W razie wątpliwości przetestuj je sam.

 174
Author: Liam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-04 09:22:30

Przykład w odpowiedzi Liama zapisuje plik jako ciąg znaków w jednej linii. Wolę dodać formatowanie. Ktoś w przyszłości może chcieć ręcznie zmienić jakąś wartość w pliku. Jeśli dodasz formatowanie, łatwiej to zrobić.

Następujące dodaje podstawowe wcięcie JSON:

 string json = JsonConvert.SerializeObject(_data.ToArray(), Formatting.Indented);
 41
Author: Michał S.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-23 08:11:29

Istnieje do tego wbudowana funkcjonalność przy użyciu klasy JavaScriptSerializer :

var json = JavaScriptSerializer.Serialize(data);
 7
Author: Gabe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-02 08:53:37
var responseData = //Fetch Data
string jsonData = JsonConvert.SerializeObject(responseData, Formatting.None);
System.IO.File.WriteAllText(Server.MapPath("~/JsonData/jsondata.txt"), jsonData);
 3
Author: Kulwant Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-05 22:59:03