C # bir JSON dosyası nasıl yazılır?


146

C # JSON biçimini kullanarak bir metin dosyasına aşağıdaki verileri yazmak gerekiyor. Köşeli ayraçlar geçerli JSON biçimi olması açısından önemlidir.

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

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

İşte model sınıfım:

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

Yanıtlar:


276

Json.Net'i tavsiye ederim , aşağıdaki örneğe bakın:

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

Veya yukarıdaki kodun biraz daha verimli bir sürümü (arabellek olarak bir dize kullanmaz):

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

Belgeler: JSON'u bir dosyaya seri hale getirme


Neden? Burada yaygın serileştiriciler ve karşılaştırma testleri † ‡ arasında bir özellik karşılaştırması .

Bağlantılı makaleden alınan bir performans grafiği aşağıdadır:

resim açıklamasını buraya girin

Bu ayrı gönderi şunları belirtmektedir:

Json.NET her zaman bellek verimli olmuştur, okuma ve yazma büyük belgeleri tamamen belleğe yüklemek yerine, ama ben nesne tahsis azaltılabilir birkaç anahtar yerler bulmak mümkün ...... (şimdi) Json.Net (6.0) JavaScriptSerializer'dan 8 kat daha az bellek ayırır


Net Core 3.0'dan beri güncelleme

Bunu yazdıktan sonra blokta yeni bir çocuk System.Text.Json.Net Core 3.0'a eklendi. Microsoft, bunun Newtonsoft'tan daha iyi olduğu konusunda birkaç iddiada bulunuyor . O olduğunu dahil Newtonsoft daha hızlı . yukarıdaki gibi, bunu kendiniz test etmenizi tavsiye ederim .

† Deneyler Json.Net 5 gibi görünüyor, geçerli sürüm (yazılırken) 10'dur. Kullanılan standart .Net serileştiricilerinin hangi sürümünden bahsedilmez

Tests Bu testler açık bir şekilde kütüphaneyi koruyan geliştiriciler tarafından yapılmıştır. Onların iddialarını doğrulamamıştım . Şüpheniz varsa bunları kendiniz test edin.


1
JSON.NET JavaScriptSerializerve DataContractJsonSerializersınıfları tarafından sağlanan yerleşik destekten nasıl farklıdır ?
Robert Harvey

2
@RobertHarvey Liam'ın Json.Net bağlantısında farklılıkların ne olduğunu gösteren güzel bir tablo var. Bunu yapan insanlardan geliyorsanız, elbette bir tuz tanesi ile almalısınız, ama gerçekten yerleşik şeylerden daha iyidir.
Tim S.

1
Evet Dosyaya tekrar tekrar
eklemem

1
Bu durumda dosyayı okumanız, nesnelere ayrıştırmanız, nesnelere eklemeniz ve sonra tekrar ayrıştırmanız gerekir.
Liam

4
@ Çekme Noakes Bir dosyaya önce belleğe koymadan yazmak istiyorsanız, bu yazıyı JSON.NET
gcoleman0828

62

Liam'ın cevabındaki örnek dosyayı tek bir satıra dize olarak kaydeder. Biçimlendirme eklemeyi tercih ederim. Gelecekte biri dosyadaki bazı değerleri manuel olarak değiştirmek isteyebilir. Biçimlendirme eklerseniz bunu yapmak daha kolaydır.

Aşağıdakiler temel JSON girintisini ekler:

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


4
var responseData = //Fetch Data
string jsonData = JsonConvert.SerializeObject(responseData, Formatting.None);
System.IO.File.WriteAllText(Server.MapPath("~/JsonData/jsondata.txt"), jsonData);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.