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


145

我需要在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;}
}

Answers:


274

我会推荐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序列化为文件


为什么?这是常见串行器与基准测试 †‡ 之间功能比较

下面是从链接的文章中获得的性能图:

在此处输入图片说明

单独的帖子指出:

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。未提及使用的标准.Net序列化器版本。

‡这些测试显然来自维护该库的开发人员。我尚未核实他们的说法。如有疑问,请自己测试。


1
JSON.NET与JavaScriptSerializerDataContractJsonSerializer类提供的内置支持有何不同?
罗伯特·哈维

2
@RobertHarvey Liam的Json.Net链接有一个漂亮的表格,显示了不同之处。来自制造它的人,您当然应该带一点盐,但是它确实比内置的东西要好。
Tim S.

1
是的,我需要一遍又一遍地附加到文件,但是它们必须全部位于同一阵列中
user1429595 2013年

1
在这种情况下,您将需要读取文件,将其解析为对象,添加到对象,然后再次解析回该文件。
利亚姆

4
@Drew诺克斯如果你想要做写入一个文件,而不把它首先在内存中,尝试从JSON.NET这个写james.newtonking.com/archive/2009/02/14/...
gcoleman0828

61

Liam的答案中的示例将文件另存为字符串。我更喜欢添加格式。将来有人可能想在文件中手动更改一些值。如果您添加格式设置,则更容易实现。

以下内容添加了基本的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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.