Bagaimana cara menulis file JSON dalam C #?

146

Saya perlu menulis data berikut ke dalam file teks menggunakan format JSON di C #. Kurung penting agar format JSON valid.

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

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

Inilah kelas model saya:

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

Jawaban:

276

Saya akan merekomendasikan Json.Net , lihat contoh di bawah ini:

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

Atau versi yang sedikit lebih efisien dari kode di atas (tidak menggunakan string sebagai 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);
}

Dokumentasi: Serialisasi JSON ke file


Mengapa? Berikut ini adalah perbandingan fitur antara serialiser umum serta tes benchmark † ‡.

Di bawah ini adalah grafik kinerja yang diambil dari artikel yang ditautkan:

masukkan deskripsi gambar di sini

Pos terpisah ini menyatakan bahwa:

Json.NET selalu efisien dalam memori, mengalirkan membaca dan menulis dokumen besar daripada memuatnya seluruhnya ke dalam memori, tetapi saya dapat menemukan beberapa tempat utama di mana alokasi objek dapat dikurangi ...... (sekarang) Json.Net (6.0) mengalokasikan 8 kali lebih sedikit memori daripada JavaScriptSerializer


Pembaruan sejak .Net Core 3.0

Seorang anak baru di blok sejak menulis ini adalah System.Text.Jsonyang telah ditambahkan ke .Net Core 3.0. Microsoft membuat beberapa klaim tentang bagaimana ini, sekarang, lebih baik daripada Newtonsoft . Termasuk itu lebih cepat dari Newtonsoft . seperti di atas, saya akan menyarankan Anda untuk menguji ini sendiri .

† Tingkatan yang dicapai adalah Json.Net 5, versi saat ini (saat menulis) adalah 10. Versi standar apa yang digunakan oleh serialisNet.

‡ Tes ini jelas dari pengembang yang mengelola perpustakaan. Saya belum memverifikasi klaim mereka . Jika ragu, cobalah sendiri.

Liam
sumber
1
Apa perbedaan JSON.NET dari dukungan bawaan yang disediakan oleh JavaScriptSerializerdan DataContractJsonSerializerkelas?
Robert Harvey
2
Tautan Json.Net @RobertHarvey Liam memiliki tabel yang bagus yang menunjukkan perbedaannya. Berasal dari orang-orang yang membuatnya, tentu saja Anda harus mengambilnya dengan sebutir garam, tetapi itu memang lebih baik daripada barang bawaan.
Tim S.
1
Ya saya harus menambahkan file berulang-ulang, tetapi mereka harus semua dalam array yang sama
user1429595
1
Dalam hal ini, Anda perlu membaca file, mengurainya menjadi objek, menambahkan ke objek, lalu menguraikannya kembali.
Liam
4
@Drew Noakes Jika Anda ingin menulis ke file tanpa memasukkannya ke dalam memori terlebih dahulu, coba tulis ini dari JSON.NET james.newtonking.com/archive/2009/02/14/…
gcoleman0828
62

Contoh dalam jawaban Liam menyimpan file sebagai string dalam satu baris. Saya lebih suka menambahkan pemformatan. Seseorang di masa depan mungkin ingin mengubah beberapa nilai secara manual dalam file. Jika Anda menambahkan pemformatan, lebih mudah melakukannya.

Berikut ini menambahkan indentasi JSON dasar:

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