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

时间:2017-10-16 11:16:51

标签: json.net

我正在尝试使用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位。

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

1 个答案:

答案 0 :(得分:0)

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

像这样

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