【问题标题】:How to deserialize JSON using parameterized constructor with nested objects如何使用带有嵌套对象的参数化构造函数反序列化 JSON
【发布时间】:2017-10-16 20:27:26
【问题描述】:

我正在尝试使用 Newtonsoft.Json 反序列化此 JSON:

[
  {
    "name": "New cheese 1",
    "inputs": {
      "cheeseNumber": "01"
    }
  },
  {
    "name": "New Cheese 2",
    "inputs": {
      "cheeseNumber": "02"
    }
  }
]

使用参数化构造函数,以便我可以将设置器保持私有。我正在反序列化使用:

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; }
    }
}

注释掉构造函数后,它就可以工作了。但这需要输入的设置器是公开的,我希望它是私有的。将其标记为私有且未注释 ctor,我得到了

Newtonsoft.Json.dll 中出现“Newtonsoft.Json.JsonSerializationException”类型的未处理异常

附加信息:找不到用于类型 ReadingJsonIntoObjects.Cheese 的构造函数。一个类应该有一个默认构造函数、一个带参数的构造函数或一个标有 JsonConstructor 属性的构造函数。路径“[0].name”,第 3 行,位置 11。

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

【问题讨论】:

    标签: json.net


    【解决方案1】:

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

    喜欢这个

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多