184

I need to write the following data into a text file using JSON format in C#. The brackets are important for it to be valid JSON format.

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

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

Here is my model class:

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

4 回答 4

369

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

  • .Net Core 现在拥有惊人相似的System.Text.Json序列化器(见下文)
  • 幸运的是,这个时代JavaScriptSerializer已经过去了,这个课程甚至不在 .Net Core 中。这使 Newtonsoft 进行的许多比较无效。
  • 最近也引起了我的注意,通过我们在工作中使用的一些漏洞扫描软件,Json.Net 已经有一段时间没有更新了。2020 年的更新已经枯竭,最新版本 12.0.3 已经使用了一年多(2021 年)。
  • 速度测试(之前在下面引用但现在已删除,因为它们已经过时以至于它们似乎无关紧要)正在比较旧版本的 Json.Net(版本 6.0,就像我说的最新版本是12.0.3)和过时的 .Net框架序列化器。
  • 序列化程序相对于 Newtonsoft 的一个优势System.Text.Json是它支持async/await

Json.Net 的日子屈指可数了吗?它仍然被大量使用,并且仍然被 MS 库使用。所以可能不会。但这确实感觉像是这个库的结束的开始,它很可能只是运行它的过程。


.Net Core 3.0+ 和 .Net 5

自从写这篇文章以来,一个新的孩子System.Text.Json已经被添加到 .Net Core 3.0 中。微软多次声称它现在比 Newtonsoft 更好。包括它比 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);

文档


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

文档:将 JSON 序列化为文件

于 2013-06-04T15:25:28.763 回答
76

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

以下添加了基本的 JSON 缩进:

 string json = JsonConvert.SerializeObject(_data.ToArray(), Formatting.Indented);
于 2013-11-07T14:50:57.243 回答
8

使用JavaScriptSerializer 类为此内置了功能:

var json = JavaScriptSerializer.Serialize(data);
于 2013-06-04T15:26:23.283 回答
5
var responseData = //Fetch Data
string jsonData = JsonConvert.SerializeObject(responseData, Formatting.None);
System.IO.File.WriteAllText(Server.MapPath("~/JsonData/jsondata.txt"), jsonData);
于 2016-11-05T22:33:55.487 回答