如何使用带有嵌套对象的参数化构造函数反序列化JSON



我正在尝试使用Newtonsoft反序列化此JSON。JSON:

[
{
"name": "New cheese 1",
"inputs": {
"cheeseNumber": "01"
}
},
{
"name": "New Cheese 2",
"inputs": {
"cheeseNumber": "02"
}
}
]

使用参数化构造函数,这样我就可以保持setter私有。我正在使用进行反序列化

using (StreamReader r = new StreamReader(cheeseFilePath))
{
var json = r.ReadToEnd();
var cheeses = JsonConvert.DeserializeObject<List<Cheese>>(json);
foreach (var cheese in cheeses)
{
Console.WriteLine(cheese.ToString());
}
}

这些是我的课程:

using System;
namespace ReadingJsonIntoObjects
{
public class Cheese
{
//private Cheese(string name,
//    Inputs inputs)
//{
//    this.Name = name;
//    this.Inputs = inputs;
//}
public String Name { get; set; }
public override string ToString()
{
return String.Format("Cheese: '{0}' - Inputs: CheeseNumber: {1}", 
this.Name, this.Inputs.CheeseNumber);
}
public Inputs Inputs { get; set; }
}
public class Inputs
{
public Inputs(string cheeseNumber)
{
this.CheeseNumber = cheeseNumber;
}
public String CheeseNumber { get; private set; }
}
}

有了构造函数的注释,它就工作了。但这需要Inputs的setter是公共的,我希望它是私有的。将其标记为private并取消注释ctor,我得到

Newtonsoft.Json.dll 中发生类型为"Newtonsoft.Json.JsonSerializationException"的未处理异常

附加信息:找不到用于ReadingJsonIntoObjects.Cheese类型的构造函数。类应该有一个默认构造函数、一个带参数的构造函数或一个用JsonConstructor特性标记的构造函数。路径"[0].name",第3行,位置11。

该类只有一个带参数的构造函数,但无法识别。有没有一种方法可以将其标记为私有,并且仍然正确地反序列化?

Json.Net更喜欢在对象上使用默认(不带参数)构造函数,如果您想使用非默认构造函数,可以将[JsonConstructor]属性添加到您希望Json.Net调用的构造函数中。

像这个

[JsonConstructor]
private Cheese(string name, Inputs inputs)
{
this.Name = name;
this.Inputs = inputs;
}

相关内容

  • 没有找到相关文章

最新更新