将类序列化为 .json 文件

Posted

技术标签:

【中文标题】将类序列化为 .json 文件【英文标题】:Serializing class to .json file 【发布时间】:2021-12-18 03:28:21 【问题描述】:

只是尝试做一个简单的序列化(第一次尝试)。 实际上,直到我更改了一些内容并添加了反序列化并添加了一个使我的其他方式不再起作用的类之前,它才开始工作。

基本上,我将反序列化 json 的内容作为对象,并试图颠倒事情的顺序。但现在我在 foreach 循环中遇到错误,我不确定是否需要。 一旦我得到序列化工作,我确信我也会被困在如何格式化字符串,因为它进入 .json 文件以便它正确附加,但那是另一天。

这是我收到的错误

System.NullReferenceException: '对象引用未设置为对象的实例。'

我在foreach(var translogs in Logs.transLogs) 行收到此异常

这是我的活动。

代码

private void toolPull_Click(object sender, EventArgs e)

    double cost = Convert.ToDouble(active_Cost.Text);
    int serial = Convert.ToInt32(transactionSerial_Box.Text);
    DateTime timeNow = DateTime.Now;
    TransactionLogs Logs = new TransactionLogs();
    foreach(var translogs in Logs.transLogs)
    
        translogs.Employee = transactionEmployee_Box.Text;
        translogs.Serial = serial;
        translogs.Cost = cost;
        translogs.Description = active_Description.Text;
        translogs.CurrentDate = timeNow;
    

    string stringJson = JsonConvert.SerializeObject(Logs);
    StreamWriter sw = new StreamWriter(@"C:\transactionlog.json", append: true);
    sw.WriteLine(stringJson);
    sw.Close();

这是使用 json 的类

namespace QuickType

    using System;
    using System.Collections.Generic;

    using System.Globalization;
    using Newtonsoft.Json;
    using Newtonsoft.Json.Converters;

    public partial class TransactionLogs
    
        [JsonProperty("TransactionLog")]
        public List<TransactionLog> transLogs  get; set; 
    

    public partial class TransactionLog
    
        [JsonProperty("employee")]
        public string Employee  get; set; 

        [JsonProperty("currentDate")]
        public DateTime CurrentDate  get; set; 

        [JsonProperty("serial")]
        public int Serial  get; set; 

        [JsonProperty("description")]
        public string Description  get; set; 

        [JsonProperty("isPull")]
        public bool IsPull  get; set; 

        [JsonProperty("cost")]
        public double Cost  get; set; 
    

这里是 json 文件


   "TransactionLog":[
      
         "employee":"Joey",
         "currentDate":"2021-11-03T11:49:13.5741628-04:00",
         "serial":1111,
         "description":"1/2-20 Threadmill",
         "isPull":true,
         "_ost":25.68
      ,
      
         "employee":"joey",
         "currentDate":"2021-11-03T11:50:34.6344474-04:00",
         "serial":1000,
         "description":"1/2-20 Threadmill",
         "isPull":true,
         "cost":25.68
      ,
      
         "employee":"john",
         "currentDate":"2021-11-03T11:50:40.9956616-04:00",
         "serial":2000,
         "description":"1/2-20 Threadmill",
         "isPull":true,
         "cost":25.68
      ,
      
         "employee":"Jim",
         "currentDate":"2021-11-03T11:51:24.5559292-04:00",
         "serial":4565,
         "description":"1/2-20 Threadmill",
         "isPull":true,
         "cost":25.68
      
   ]

【问题讨论】:

什么错误?我们需要更具体的信息来了解问题所在。请清楚地解释您的尝试有什么问题。我们非常乐意提供帮助:) translogs 列表可能为 null,因为未初始化。先尝试创建一个新实例。 将transLogs初始化添加到TransactionLogs类构造函数 你能解释一下怎么做吗? 做到了。我正在慢慢理解这些东西,但这是一条崎岖不平的道路。感谢您的帮助。如果您将其添加为答案,我很乐意将其标记为我的问题的答案 【参考方案1】:

让我在这里记录一下 cmets 的结果。

这两行有两个问题:

TransactionLogs Logs = new TransactionLogs();
foreach(var translogs in Logs.transLogs)
TransactionLogstransLogs 集合未初始化,这是导致 NRE 的原因 修复 foreach 处理空集合后

第一个问题的修复:

Logs.transLogs = new List<TransactionLog>();

第二个问题的修复:

var transLogs = new TransactionLog()

    Employee = transactionEmployee_Box.Text;
    Serial = serial;
    Cost = cost;
    Description = active_Description.Text;
    CurrentDate = timeNow;
;
Logs.transLogs.Add(transLogs);

因此,您必须通过添加一个新成员来填充它,而不是遍历空集合。

【讨论】:

以上是关于将类序列化为 .json 文件的主要内容,如果未能解决你的问题,请参考以下文章

Python将类序列化为JSON [重复]

使用 WCF 将类序列化为 xsd.exe 生成的 JSON

将类反序列化为文件并返回列表

使用 JsonConvert.DeserializeObject 或 JObject.Parse 将类反序列化为 c# 中的字典

将类结构序列化为 XML 似乎添加了一个 NewLine 字符

如何使用 Windows Phone 8 SDK 将类序列化为 XML?