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

212

我需要使用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;}
}
5个回答

423

更新2020:距离我写下这篇答案已经过去了7年。它仍然似乎受到了很多关注。在2013年,Newtonsoft Json.Net是解决这个问题的唯一答案。现在它仍然是一个解决这个问题的好方法,但不再是唯一可行的选择。为了使这个答案更加实时,请注意以下几点:

  • .NET Core现在有一个非常相似的System.Text.Json序列化器(见下文)
  • 感谢上帝,JavaScriptSerializer的日子已经过去了,而且这个类甚至不在.NET Core中。这使得Newtonsoft运行的许多比较都失效了。
  • 速度测试如下引用,但现在已被删除,因为它们太过时了,看起来不相关)正在将旧版本的Json.Net(版本6.0,正如我所说,最新版本是12.0.3)与过时的.Net Framework序列化器进行比较。
  • System.Text.Json序列化器比Newtonsoft更具有优势,因为它支持async/await
Json.Net的日子是否已经到头了?它仍然被很多人使用,并且它仍然被微软库使用。因此可能不会。但是这确实感觉像是这个库的末路开始了,也许它已经完成了其历程。

.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序列化到文件中


1
JSON.NET与JavaScriptSerializerDataContractJsonSerializer类提供的内置支持有何不同? - Robert Harvey
2
@RobertHarvey Liam的Json.Net链接有一个漂亮的表格,展示了它与其他工具的区别。当然,这个表格是由制造商提供的,你应该保持一定的谨慎,但它确实比内置的工具更好。 - Tim S.
1
我想知道是否可以在不将字符串缓存在内存中的情况下完成此操作。你知道吗? - Drew Noakes
4
如果您想在不首先将其放入内存中的情况下写入文件,请尝试使用JSON.NET进行写入。详情请查看http://james.newtonking.com/archive/2009/02/14/writing-json-to-a-file-using-json-net。 - gcoleman0828
2
如果您想包含缩进,可以使用 serializer.Formatting = Formatting.Indented; - JohnnyAce
显示剩余4条评论

80

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

以下是基本的JSON缩进:

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

8

5
var responseData = //Fetch Data
string jsonData = JsonConvert.SerializeObject(responseData, Formatting.None);
System.IO.File.WriteAllText(Server.MapPath("~/JsonData/jsondata.txt"), jsonData);

1
如果你有与你要放入JSON的数据结构直接匹配的数据结构,那么使用JsonSerialize是一个不错的选择。但这并不是.Net所支持的唯一方式。我想提供这种其他方式,让那些搜索的人知道.Net还包括这种其他接口。
有时候你不仅仅想直接序列化C#,可能是因为你正在处理遗留代码、多个代码库、奇怪的JSON接口,或者其他原因。在.Net中,你可以手动创建JSON。以下代码将一个data对象列表写入文件,但如果你想从HTTP请求中返回Json,也有其他函数可用。当然,所有这些函数都有相应的读取函数。
using System.Text.Json;

public void WriteDataList(string filename, IEnumerable<data> dataList)
{
    var filestream = File.OpenWrite(filename);
    var writer = new Utf8JsonWriter(filestream);
    writer.WriteStartArray();
    foreach (var dataItem in dataList) {
        writer.WriteStartObject();
        writer.WriteNumber("Id", dataItem.Id);
        writer.WriteNumber("SSN", dataItem.SSN);
        writer.WriteString("Message", dataItem.Message);
        writer.WriteEndObject();
    }
    writer.WriteEndArray();
    writer.Flush();
    filestream.Close();
}

如果需要的话,还有WriteValue函数,例如,填充一个数组。智能感知、自动补全和谷歌应该能帮助你完成剩下的部分。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接