将JSON项添加到ListBox时,“value不能为null”

时间:2014-08-28 20:22:59

标签: c# .net json winforms listbox


我正在尝试从一个文件加载名称并将其添加到列表框中 我要加载的代码:

if (File.Exists(file))
{
    List<Purchaser> Purchasers = JsonConvert.DeserializeObject<List<Purchaser>>(File.ReadAllText(file));
    Purchaser purchaser = new Purchaser();
    listDOF.Items.Add(purchaser.Name);
}

但这给了我一个例外,说价值不能为空 进行测试将Name值应用于一个标签而不是像label1.Text = purchaser.Name这样的列表框,让标签为空!所以,我认为文件没有加载或我做错了。
对于List类,我有:

public class Purchaser
{
    public string Name { get; set; }
    public bool Paid { get; set; }
}
List<Purchaser> Purchasers = new List<Purchaser>();

文件按我的意愿保存,但这不会将Name值加载到列表框中 有人可以帮我一把吗?我想在一整天都这样做!谢谢!

2 个答案:

答案 0 :(得分:1)

new Purchaser().Name始终为null 1 ,因此Items.Add(null) throws an exception

要修复此错误,使用 JSON信息 - 无需创建新的未初始化的购买者。例如,

var json = File.ReadAllText(file);
var purchasers = JsonConvert.DeserializeObject<List<Purchaser>>(json);
// for each purchaser, add them to the list
for (var p in purchasers) {
  listDOF.Items.Add(p.Name ?? "{null}");
}

如上所述,ListBox.ObjectCollection.Add不接受空值。虽然主要问题是通过使用JSON注释中的信息来修复null-coalescing operator (??)的额外用法。如果有人真的错过了一个名字(不要与空白名称混淆),使用这个防护可以防止异常 - 这不应该发生,但要防守!


1 Null是引用类型的默认值,包括字符串;由于(Name)属性尚未分配任何其他值,因此它仍然是默认值 - 或null。

答案 1 :(得分:1)

试试这个。

if (File.Exists(file))
{
    var purchasers = JsonConvert.DeserializeObject<IEnumerable<Purchaser>>(File.ReadAllText(file));
    foreach(var purchaser in purchasers)
    {
        if(string.IsNullOrWhitespace(purchaser.Name))
        {
            //nulls are not allowed
            continue;
        }
        listDOF.Items.Add(purchaser.Name);
    }
}

当您执行此操作时Purchaser purchaser = new Purchaser();创建一个没有默认值以外的数据的新单个实例。