我正在尝试使用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。
该类只有一个带参数的构造函数,但无法识别。有没有一种方法可以将其标记为私有,并且仍然正确地反序列化?
[JsonConstructor]
属性添加到您希望Json.Net调用的构造函数中。
像这个
[JsonConstructor]
private Cheese(string name, Inputs inputs)
{
this.Name = name;
this.Inputs = inputs;
}