在我们的应用程序中,使用动态对象存在问题,这是使用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,表示没有无参数的构造函数。但是Model
和Option
都有无参数的构造函数(并且我现在甚至没有使用Model
)。
如何将属性modelDto.Options
转换为Option[]
?
答案 0 :(得分:3)
这不是您问题的确切答案,但是您可以使用模型轻松地反序列化此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