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

use*_*595 130 c# json json.net asp.net-web-api

我需要在C#中使用JSON格式将以下数据写入文本文件.括号对于它是有效的JSON格式很重要.

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

  },
  {
   "Id": 2,
    "SSN": 125,
    "Message": "whatever"
  }
]
Run Code Online (Sandbox Code Playgroud)

这是我的模型类:

public class data
{
    public int Id { get; set; }
    public int SSN { get; set; }
    public string Message { get; set;}
}
Run Code Online (Sandbox Code Playgroud)

Lia*_*iam 243

我推荐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);
Run Code Online (Sandbox Code Playgroud)

或者上面代码稍微更有效的版本(不使用字符串作为缓冲区):

//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);
}
Run Code Online (Sandbox Code Playgroud)

文档:将JSON序列化为文件


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

以下是从链接文章中获取的性能图表:

在此输入图像描述

这篇单独的帖子指出:

Json.NET一直是内存高效的,流式读取和写入大型文档而不是将它们完全加载到内存中,但我能够找到几个可以减少对象分配的关键位置...... (现在) Json.Net (6.0)分配的内存比JavaScriptSerializer少8倍

‡.

†基准测试似乎是Json.Net 5,当前版本(写入时)是10.没有提到使用什么版本的标准.Net序列化器

‡这些测试显然来自管理图书馆的开发人员.我还没有核实他们的说法.如有疑问,请自行测试.

  • @Drew Noakes如果你想先写一个文件而不先把它放在内存中,试试这个来自JSON.NET的书写http://james.newtonking.com/archive/2009/02/14/writing-json-to-一个文件,使用JSON的网 (4认同)
  • @RobertHarvey Liam的Json.Net链接有一个很好的表格,显示了差异.来自制造它的人,当然你应该带着一粒盐,但它确实比内置的东西更好. (2认同)
  • 如果您想包含缩进,可以使用 `serializer.Formatting = Formatting.Indented;`。 (2认同)

小智 54

Liam的答案中的示例将文件作为字符串保存在一行中.我更喜欢添加格式.将来某人可能希望在文件中手动更改某些值.如果添加格式,则更容易.

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

 string json = JsonConvert.SerializeObject(_data.ToArray(), Formatting.Indented);
Run Code Online (Sandbox Code Playgroud)


Gab*_*abe 7

使用JavaScriptSerializer类有内置的功能:

var json = JavaScriptSerializer.Serialize(data);
Run Code Online (Sandbox Code Playgroud)


小智 5

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