我开始认为我需要在Json.net中编写自定义转换器,因为到目前为止,常规转换器并没有削减它。 我有一个类游戏
class Game
{
[JsonProperty]
public int Edition { get; private set; }
[JsonProperty]
public string Name
{
get
{
return NameType.ToString();
}
private set
{
name = value;
}
}
[JsonProperty]
public string Date { get; private set; }
[JsonConverter(typeof(StringEnumConverter))]
public GameType NameType { get; private set; } //enum
public List<Question> Questions { get; private set; } //yes, Question is serializable
public Game(string Date, GameType t, int num, List<Question> q)
{
this.Date = Date;
this.NameType = t;
this.Edition = num;
this.Questions = q;
}
序列化到正确的Json,但不能正确反序列化。 Json看起来像这样:
{
"Edition": 1,
"Name": "Regular",
"Date": "2016",
"NameType": "Regular",
"Questions": [
{
"QuestionNumber": "1",
"Round": 1,
"Body": "1. A couple paragraphs",
"Answer": " answers"
},
]
}
但是当反序列化时,它出现为:
日期和#34; 2016&#34 ;, 版本&#34; 1&#34;, 姓名&#34;无&#34;, NameType&#34;无&#34;, 问题无效
我在反序列化中做错了吗
Game g = JsonConvert.DeserializeObject<Game>(File.ReadAllText(path));
或者这是一种保证编写自定义序列化程序的情况吗?
我还没有找到一个目前已回答的问题来处理我遇到的这个错误,并且根据Json.net上的文档,大多数需要自定义序列化程序的奇怪边缘情况都是非IEnumerables和DateTimes。
答案 0 :(得分:1)
看起来您正在尝试创建一个具有一些不可变属性的类,即Edition
,Date
,NameType
。此外,其中一个NameType
需要一个JsonConverter
应用于Json.NET正确序列化。您可以通过给它一个构造函数来序列化和反序列化这样的类,其中必要的属性作为参数传入,前提是参数名称与c#属性名称相同,模数为。您可以将属性[JsonConverter(typeof(StringEnumConverter))]
应用于相应的参数以及相应的属性,但是如果未应用,则只要属性和参数具有相同的声明{{3},就会使用相应属性的转换器。 }}
class Game
{
public Game(int edition, string date, [JsonConverter(typeof(StringEnumConverter))] GameType nameType)
{
this.Edition = edition;
this.Date = date;
this.NameType = nameType;
this.Questions = new List<Question>();
}
public int Edition { get; private set; }
[JsonIgnore]
public string Name
{
get
{
return NameType.ToString();
}
}
public string Date { get; private set; }
[JsonConverter(typeof(StringEnumConverter))]
public GameType NameType { get; private set; } //enum
public List<Question> Questions { get; private set; } //yes, Question is serializable
}
示例types。
如果您的类有多个构造函数,请使用fiddle标记具有所有必需的不可变属性的构造函数,例如:
public Game(int edition, string date, [JsonConverter(typeof(StringEnumConverter))] GameType nameType)
: this(edition, date, nameType, new List<Question>())
{
}
[JsonConstructor]
public Game(int edition, string date, [JsonConverter(typeof(StringEnumConverter))] GameType nameType, List<Question> questions)
{
this.Edition = edition;
this.Date = date;
this.NameType = nameType;
this.Questions = questions;
}