Làm cách nào để viết một tệp JSON trong C #?


145

Tôi cần ghi dữ liệu sau vào tệp văn bản bằng định dạng JSON trong C #. Các dấu ngoặc rất quan trọng để nó có định dạng JSON hợp lệ.

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

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

Đây là lớp mô hình của tôi:

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

Câu trả lời:


274

Tôi muốn giới thiệu Json.Net , xem ví dụ dưới đây:

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

Hoặc phiên bản hiệu quả hơn một chút của mã trên (không sử dụng chuỗi làm bộ đệm):

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

Tài liệu: Nối tiếp JSON vào một tệp


Tại sao? Đây là một so sánh tính năng giữa các serialisers phổ biến cũng như các bài kiểm tra điểm chuẩn † ‡.

Dưới đây là biểu đồ hiệu suất được lấy từ bài viết được liên kết:

nhập mô tả hình ảnh ở đây

Bài đăng riêng biệt này , nói rằng:

Json.NET luôn có hiệu quả bộ nhớ, phát trực tiếp việc đọc và viết các tài liệu lớn thay vì tải chúng hoàn toàn vào bộ nhớ, nhưng tôi đã có thể tìm thấy một vài vị trí quan trọng có thể giảm phân bổ đối tượng ...... (bây giờ) Json.Net (6.0) giao đất 8 lần ít bộ nhớ hơn JavaScriptSerializer


Cập nhật kể từ .Net Core 3.0

Một đứa trẻ mới trên khối kể từ khi viết bài này System.Text.Jsonđã được thêm vào .Net Core 3.0. Microsoft đưa ra một số tuyên bố về việc làm thế nào, bây giờ, tốt hơn Newtonsoft . Bao gồm cả nó nhanh hơn Newtonsoft . như trên, tôi muốn khuyên bạn nên tự kiểm tra này .

Điểm chuẩn xuất hiện là Json.Net 5, phiên bản hiện tại (bằng văn bản) là 10. Phiên bản nào của bộ nối tiếp .Net được sử dụng không được đề cập

Những thử nghiệm này rõ ràng là từ các nhà phát triển duy trì thư viện. Tôi chưa xác minh yêu cầu của họ . Nếu nghi ngờ hãy tự kiểm tra chúng.


1
JSON.NET khác với hỗ trợ tích hợp được cung cấp bởi các lớp JavaScriptSerializerDataContractJsonSerializercác lớp như thế nào?
Robert Harvey

2
Liên kết Json.Net của @RobertHarvey Liam có một bảng đẹp cho thấy sự khác biệt là gì. Đến từ những người làm ra nó, tất nhiên bạn nên dùng nó với một hạt muối, nhưng nó thực sự tốt hơn những thứ tích hợp sẵn.
Tim S.

1
Có, tôi cần phải nối lại tệp nhiều lần, nhưng chúng cần phải nằm trong cùng một mảng
user1429595

1
Trong trường hợp đó, bạn sẽ cần phải đọc tệp, phân tích nó thành các đối tượng, thêm vào các đối tượng, sau đó phân tích lại.
Liam

4
@Drew Noakes Nếu bạn muốn ghi vào một tệp mà không đặt nó vào bộ nhớ trước, hãy thử viết từ JSON.NET james.newtonking.com/archive/2009/02/14/ọ
gcoleman0828

61

Ví dụ trong câu trả lời của Liam lưu tệp dưới dạng chuỗi trong một dòng. Tôi thích thêm định dạng. Ai đó trong tương lai có thể muốn thay đổi một số giá trị bằng tay trong tệp. Nếu bạn thêm định dạng, nó dễ dàng hơn để làm như vậy.

Sau đây thêm thụt lề JSON cơ bản:

 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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.