我正在尝试使用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; }
}
}
随着构造函数的注释,它可以工作。但这需要输入的setter是公共的,我希望它是私有的。随着它被标记为私人而ctor未被注释,我得到了
Newtonsoft.Json.dll中出现未处理的“Newtonsoft.Json.JsonSerializationException”类型异常
其他信息:无法找到用于类型ReadingJsonIntoObjects.Cheese的构造函数。一个类应该有一个默认的构造函数,一个带参数的构造函数或一个用JsonConstructor属性标记的构造函数。路径'[0] .name',第3行,第11位。
该类只有一个带参数的构造函数,但它无法识别。有没有办法将其标记为私有并仍然正确反序列化?
答案 0 :(得分:0)
Json.Net更喜欢在对象上使用默认(不带参数)构造函数,如果要使用非默认构造函数,可以将[JsonConstructor]
属性添加到希望Json.Net调用的构造函数中。
[JsonConstructor]
private Cheese(string name, Inputs inputs)
{
this.Name = name;
this.Inputs = inputs;
}