【问题标题】:How to write a JSON file in C#?如何在 C# 中编写 JSON 文件?
【发布时间】:2013-05-31 01:47:13
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    • .Net Core 现在拥有惊人相似的 System.Text.Json 序列化器(见下文)
    • 谢天谢地,JavaScriptSerializer 的日子已经过去了,这个课程甚至不在 .Net Core 中。这使得 Newtonsoft 进行的许多比较无效。
    • 最近也引起了我的注意,通过我们在工作中使用的一些漏洞扫描软件,Json.Net 已经有一段时间没有更新了。 Updates in 2020 have dried up 和最新版本 12.0.3 已使用一年多(2021 年)。
    • speed testspreviously quoted below,但现在已删除,因为它们已经过时以至于它们似乎无关紧要)正在比较旧版本的 Json.Net(6.0 版,就像我说的那样,最新的是 12.0。 3) 带有过时的 .Net Framework 序列化程序。
    • System.Text.Json 序列化程序相对于 Newtonsoft 的一个优势是它支持 async/await

    Json.Net 的日子屈指可数了吗?它仍然被大量使用,并且仍然被 MS 库使用。所以可能不会。但这确实让人觉得这个库很可能只是顺其自然。


    .Net Core 3.0+ 和 .Net 5

    写这篇文章后,一个新的孩子是System.Text.Json,它已被添加到.Net Core 3.0。 Microsoft makes several claims to how this is, now, better than Newtonsoft。包括它是faster than 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);
    

    Documentation


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

    文档:Serialize JSON to a file

    【讨论】:

    • JSON.NET 与 JavaScriptSerializerDataContractJsonSerializer 类提供的内置支持有何不同?
    • @RobertHarvey Liam 的 Json.Net 链接有一个很好的表格,显示了不同之处。来自制作它的人,当然你应该对它持保留态度,但它确实比内置的东西更好。
    • 是的,我需要一遍又一遍地附加到文件中,但它们需要都在同一个数组中
    • @Drew Noakes 如果您想写入文件而不先将其放入内存,请尝试从 JSON.NET james.newtonking.com/archive/2009/02/14/… 写入此文件
    【解决方案2】:

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

    以下添加基本的 JSON 缩进:

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

    【讨论】:

      【解决方案3】:

      使用JavaScriptSerializer Class

      var json = JavaScriptSerializer.Serialize(data);
      

      【讨论】:

        【解决方案4】:
        var responseData = //Fetch Data
        string jsonData = JsonConvert.SerializeObject(responseData, Formatting.None);
        System.IO.File.WriteAllText(Server.MapPath("~/JsonData/jsondata.txt"), jsonData);
        

        【讨论】:

          猜你喜欢
          • 2010-12-27
          • 2021-04-17
          • 1970-01-01
          • 2013-12-27
          • 2016-05-31
          • 2012-06-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多