【问题标题】:Missing parameterless constructor when casting Jil dynamic deserialized object array转换 Jil 动态反序列化对象数组时缺少无参数构造函数
【发布时间】:2018-11-30 13:39:49
【问题描述】:

在我们的应用程序中,我们在使用动态对象时遇到了问题,这是使用 Jil 进行 JSON 反序列化的结果。下面的代码只是为了说明问题。

void Main()
{
    var modelJson = "{\"Id\":1,\"Options\":[{\"Id\":2,\"Name\":\"Option 1\"}]}";
    var modelDto = Jil.JSON.DeserializeDynamic(modelJson);

    var options = modelDto.Options;
    var optionsIEnumerable = (IEnumerable<Option>)options;

    var optionsArray1 = optionsIEnumerable.ToArray();
    var optionsArray2 = optionsIEnumerable.Cast<Option>().ToArray();
}

class Model
{
    public Model(long id, IEnumerable<Option> options = null)
        : this()
    {
        this.Id = id;
        this.Options = options;
    }

    private Model() => this.Options = new List<Option>();

    public long Id { get; }

    public IEnumerable<Option> Options { get; }
}

class Option
{
    public Option(long id, string name)
    {
        this.Id = id;
        this.Name = name;
    }

    private Option()
    {
    }

    public long Id { get; private set; }

    public string Name { get; private set; }
}

Main 中的最后两行都导致了 MissingMethodException,表示没有无参数构造函数。但是ModelOption 都有一个无参数的构造函数(此时我什至没有使用Model)。

如何将属性modelDto.Options 转换为Option[]

【问题讨论】:

  • 我猜你是否将鼠标悬停在modelDto 旁边的var 上,它会显示dynamic
  • 是的,它确实显示dynamic

标签: c# arrays json dynamic jil


【解决方案1】:

这不是您问题的确切答案,但您可以使用模型轻松反序列化此 JSON。

static void Main(string[] args)
{
    var modelJson = "{\"Id\":1,\"Options\":[{\"Id\":2,\"Name\":\"Option 1\"}]}";
    var modelDto = Jil.JSON.Deserialize<ModelNew>(modelJson);

    ShowObject(modelDto);
    Console.Read();
}

class ModelNew
{
    public int Id { get; set; }
    public  Option[] Options { get; set; }
    public ModelNew() {}
}

class Option
{
    public long Id { get; private set; }
    public string Name { get; private set; }
    private Option() {}
}

编辑:

要查看对象,请使用此函数:

static void ShowObject(ModelNew obj)
{
    Console.WriteLine("Id: " + obj.Id);
    foreach (var op in obj.Options)
    {
        Console.WriteLine("Id: " + op.Id);
        Console.WriteLine("Name: " + op.Name);
    }
}

输出: Id: 1 Id: 2 Name: Option 1

【讨论】:

  • 我会说这是确切的解决方案,也是我最终在 cmets 中要达到的目标。
  • 如果我这样做,则不会设置属性(Id 为 0,Options 为空列表)。
  • @George 如果您使用相同的 json,它会完美运行。查看编辑。
  • @L_J 感谢您将我推向正确的方向。我忘记了Model 属性的私有设置器。 Jil 需要它们进行反序列化。
猜你喜欢
  • 2016-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-13
  • 1970-01-01
  • 2012-11-02
  • 2013-02-26
相关资源
最近更新 更多