【问题标题】:Serializing class to .json file将类序列化为 .json 文件
【发布时间】: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类构造函数
  • 你能解释一下怎么做吗?
  • 做到了。我正在慢慢理解这些东西,但这是一条崎岖不平的道路。感谢您的帮助。如果您将其添加为答案,我很乐意将其标记为我的问题的答案

标签: c# json serialization json.net


【解决方案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);

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    相关资源
    最近更新 更多