จะเขียนไฟล์ JSON ใน C # ได้อย่างไร?


146

ฉันต้องเขียนข้อมูลต่อไปนี้ลงในไฟล์ข้อความโดยใช้รูปแบบ JSON ใน C # วงเล็บมีความสำคัญสำหรับการเป็นรูปแบบ JSON ที่ถูกต้อง

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

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

นี่คือคลาสโมเดลของฉัน:

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

คำตอบ:


276

ฉันจะแนะนำJson.Netดูตัวอย่างด้านล่าง:

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

หรือโค้ดด้านบนที่มีประสิทธิภาพมากกว่าเล็กน้อย (ไม่ได้ใช้สตริงเป็นบัฟเฟอร์):

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

เอกสารประกอบ: ทำให้JSON เป็นไฟล์เป็นอนุกรม


ทำไม? นี่คือการเปรียบเทียบคุณสมบัติระหว่าง serialisers ทั่วไปและการทดสอบเกณฑ์มาตรฐาน †‡

ด้านล่างเป็นกราฟของประสิทธิภาพที่นำมาจากบทความที่เชื่อมโยง:

ป้อนคำอธิบายรูปภาพที่นี่

โพสต์แยกนี้ระบุว่า:

Json.NET มีประสิทธิภาพของหน่วยความจำเสมอสตรีมมิ่งการอ่านและการเขียนเอกสารขนาดใหญ่แทนที่จะโหลดลงในหน่วยความจำทั้งหมด แต่ฉันสามารถค้นหาสถานที่สำคัญสองแห่งที่การลดการจัดสรรวัตถุจะ ...... (ตอนนี้) Json.Net (6.0)จัดสรรหน่วยความจำให้น้อยกว่า JavaScriptSerializer 8 เท่า


อัปเดตตั้งแต่. Net Core 3.0

เด็กคนใหม่ในบล็อกนับตั้งแต่เขียนสิ่งนี้System.Text.Jsonซึ่งถูกเพิ่มลงใน. Net Core 3.0 ไมโครซอฟท์กล่าวอ้างหลาย ๆ อย่างว่าดีกว่า Newtonsoftอย่างไร รวมถึงว่ามันเร็วกว่า Newtonsoft ดังกล่าวข้างต้นผมขอแนะนำให้คุณทดสอบนี้ด้วยตัวเอง‡

†มาตรฐานดูเหมือนเป็น Json.Net 5 เวอร์ชันปัจจุบัน (ตามการเขียน) คือ 10 เวอร์ชันอนุกรมมาตรฐานสุทธิที่ใช้ไม่ได้กล่าวถึง

tests การทดสอบเหล่านี้เห็นได้ชัดจากนักพัฒนาที่ดูแลห้องสมุด ฉันยังไม่ได้ยืนยันการเรียกร้องของพวกเขา หากสงสัยให้ทดสอบด้วยตนเอง


1
JSON.NET แตกต่างจากการสนับสนุนในตัวที่จัดทำโดยJavaScriptSerializerและDataContractJsonSerializerคลาสอย่างไร
Robert Harvey

2
ลิงก์ Json.Net ของ @RobertHarvey Liam มีตารางที่ดีแสดงความแตกต่าง แน่นอนว่าคุณควรนำมาพร้อมกับเม็ดเกลือ แต่มาจากคนที่สร้างมันขึ้นมาแน่นอนว่ามันดีกว่าของในตัว
Tim S.

1
ใช่ฉันต้องการผนวกไฟล์ซ้ำแล้วซ้ำอีก แต่พวกเขาจำเป็นต้องอยู่ในอาร์เรย์เดียวกันทั้งหมด
user1429595

1
ในกรณีนี้คุณจะต้องอ่านไฟล์แยกมันเป็นวัตถุเพิ่มไปยังวัตถุแล้วแยกออกไปอีกครั้ง
เลียม

4
@Drew Noakes หากคุณต้องการเขียนไฟล์โดยไม่ใส่ไว้ในหน่วยความจำก่อนลองเขียนจาก JSON.NET james.newtonking.com/archive/2009/02/14/…
gcoleman0828

62

ตัวอย่างในคำตอบของเลียมบันทึกไฟล์เป็นสตริงในบรรทัดเดียว ฉันชอบที่จะเพิ่มการจัดรูปแบบ บางคนในอนาคตอาจต้องการเปลี่ยนค่าด้วยตนเองในไฟล์ หากคุณเพิ่มการจัดรูปแบบจะทำได้ง่ายกว่า

ต่อไปนี้เพิ่มการเยื้อง JSON พื้นฐาน:

 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);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.