你会写一个自定义的Json.net Serializer / Derserializer吗?

时间:2017-01-17 05:23:52

标签: c# json json.net

我开始认为我需要在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。

1 个答案:

答案 0 :(得分:1)

看起来您正在尝试创建一个具有一些不可变属性的类,即EditionDateNameType。此外,其中一个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;
    }