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

时间:2013-06-04 15:23:48

标签: c# json json.net asp.net-web-api

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

5 个答案:

答案 0 :(得分:210)

我建议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


为什么呢?这是一个feature comparision between common serialisers as well as benchmark tests†‡。

以下是链接文章的效果图表:

enter image description here

seperate post声明:

  

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

‡。

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

‡这些测试显然是来自图书馆的开发人员。 我尚未验证他们的声明。如有疑问,请自行测试。

答案 1 :(得分:48)

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

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

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

答案 2 :(得分:7)

使用JavaScriptSerializer Class

有内置功能
var json = JavaScriptSerializer.Serialize(data);

答案 3 :(得分:3)

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

答案 4 :(得分:0)

如果你喜欢 StreamWriter 选项,你也可以使用格式:

using (StreamWriter file = File.CreateText(mFileName))
{
    JsonSerializer serializer = new JsonSerializer();
    serializer.Formatting = Formatting.Indented;
    serializer.Serialize(file, Current);
}