如何在 C# 中编写 JSON 文件?

Posted

技术标签:

【中文标题】如何在 C# 中编写 JSON 文件?【英文标题】:How to write a JSON file in C#? 【发布时间】:2013-05-31 01:47:13 【问题描述】:

我需要在 C# 中使用 JSON 格式将以下数据写入文本文件。括号对于它是有效的 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;

【问题讨论】:

【参考方案1】:

2020 年更新:我写这个答案已经 7 年了。它似乎仍然受到很多关注。 2013 年,Newtonsoft Json.Net 是这个问题的答案。现在它仍然是解决这个问题的好方法,但不再是唯一可行的选择。要为此答案添加一些最新的警告:

.Net Core 现在拥有惊人相似的 System.Text.Json 序列化器(见下文) 谢天谢地,javascriptSerializer 的日子已经过去了,这个课程甚至不在 .Net Core 中。这使得 Newtonsoft 进行的许多比较无效。 最近也引起了我的注意,通过我们在工作中使用的一些漏洞扫描软件,Json.Net 已经有一段时间没有更新了。 Updates in 2020 have dried up 和最新版本 12.0.3 已使用一年多(2021 年)。 speed tests(previously quoted below,但现在已删除,因为它们已经过时以至于它们似乎无关紧要)正在比较旧版本的 Json.Net(6.0 版,就像我说的那样,最新的是 12.0。 3) 带有过时的 .Net Framework 序列化程序。 System.Text.Json 序列化程序相对于 Newtonsoft 的一个优势是它支持 async/await

Json.Net 的日子屈指可数了吗?它仍然被大量使用,并且仍然被 MS 库使用。所以可能不会。但这确实让人觉得这个库很可能只是顺其自然。


.Net Core 3.0+ 和 .Net 5

写这篇文章后,一个新的孩子是System.Text.Json,它已被添加到.Net Core 3.0。 Microsoft makes several claims to how this is, now, better than Newtonsoft。包括它是faster than Newtonsoft。我建议你自己测试一下

示例:

using System.Text.Json;
using System.Text.Json.Serialization;

List<data> _data = new List<data>();
_data.Add(new data()

    Id = 1,
    SSN = 2,
    Message = "A Message"
);

string json = JsonSerializer.Serialize(_data);
File.WriteAllText(@"D:\path.json", json);

using System.Text.Json;
using System.Text.Json.Serialization;

List<data> _data = new List<data>();
_data.Add(new data()

    Id = 1,
    SSN = 2,
    Message = "A Message"
);

await using FileStream createStream = File.Create(@"D:\path.json");
await JsonSerializer.SerializeAsync(createStream, _data);

Documentation


Newtonsoft Json.Net(.Net 框架和 .Net Core)

另一个选项是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);

文档:Serialize JSON to a file

【讨论】:

JSON.NET 与 JavaScriptSerializerDataContractJsonSerializer 类提供的内置支持有何不同? @RobertHarvey Liam 的 Json.Net 链接有一个很好的表格,显示了不同之处。来自制作它的人,当然你应该对它持保留态度,但它确实比内置的东西更好。 是的,我需要一遍又一遍地附加到文件中,但它们需要都在同一个数组中 我很想知道this can be done without buffering the string in memory。你知道吗? @Drew Noakes 如果您想写入文件而不先将其放入内存,请尝试从 JSON.NET james.newtonking.com/archive/2009/02/14/… 写入此文件【参考方案2】:

Liam 的答案中的示例将文件保存为一行中的字符串。我更喜欢添加格式。将来有人可能想手动更改文件中的某些值。如果您添加格式,这样做会更容易。

以下添加基本的 JSON 缩进:

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

【讨论】:

【参考方案3】:

使用JavaScriptSerializer Class:

var json = JavaScriptSerializer.Serialize(data);

【讨论】:

【参考方案4】:
var responseData = //Fetch Data
string jsonData = JsonConvert.SerializeObject(responseData, Formatting.None);
System.IO.File.WriteAllText(Server.MapPath("~/JsonData/jsondata.txt"), jsonData);

【讨论】:

以上是关于如何在 C# 中编写 JSON 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中正确连接两个 Json 文件?

如何在json单引号中写入c#字符串

如何在 C# 中访问 Json(这是 HttpMessage 的结果)?

如何在 C# 中将 .json 文件转换为字符串 [重复]

如何在 C# 中验证 JSON 对象中列表的条件

如何在 C# 中高效地编写大型文本文件?