我正在尝试使用MVC 6创建API。我有几个简单的响应模型,我正在使用ObjectResult
,如下所示:
[Route("api/foos")]
public class FooController : Controller
{
[HttpGet]
public IActionResult GetFoos()
{
return new ObjectResult(FooRepository.GetAll().Select(FooModel.From));
}
}
当FooModel
是一个包含一些属性甚至简单类型列表(如字符串)的简单模型时,这种方法很有效。
但是,我现在正在尝试遵循类似的模式,其中FooModel
包含其中的其他对象的列表,并且我想在我的JSON响应中显示这些格式良好的详细信息,作为数组对象但是,通过以下课程,我收到“没有收到回复”。
public class FooModel
{
public Guid Id { get; set; }
public string Name { get; set; }
public List<Bar> Bars { get; set; }
public FooModel(Guid id, string name, List<Bar> bars)
{
this.Id = id;
this.Name = name;
this.Bars = bars;
}
internal static FooModel From(Foo foo)
{
return new FooModel(foo.Id, foo.Name, foo.Bars);
}
}
public class BarModel
{
public Guid Id { get; set; }
public string Name { get; set; }
public BarModel(Guid id, string name)
{
this.Id = id;
this.Name = name;
}
internal static BarModel From(Bar bar)
{
return new BarModel(bar.Id, bar.Name);
}
}
如果我将List<Bar>
更改为字符串列表,则响应会很好地显示JSON字符串数组。我怎样才能得到我的响应,将内部对象列表作为JSON响应中的对象数组返回?
答案 0 :(得分:0)
我设法得到了我想要的效果,但我不确定为什么这样做 - 如果有人知道为什么,请分享!我认为List<Bar>
未序列化为Bar
个对象的原因是因为Bar
位于不同的项目中(因为它是我的解决方案的更深层(域)层的一部分) 。当我更改FooModel
以引用BarModel
列表并通过更改FooModel
填充此列表以使用静态BarModel.From
方法填充此列表时,它可以正常工作,如下所示:
public class FooModel
{
public Guid Id { get; set; }
public string Name { get; set; }
public List<BarModel> Bars { get; set; }
public FooModel(Guid id, string name, List<Bar> bars)
{
this.Id = id;
this.Name = name;
this.Bars = bars.Select(BarModel.From).ToList();
}
internal static FooModel From(Foo foo)
{
return new FooModel(foo.Id, foo.Name, foo.Bars);
}
}
答案 1 :(得分:0)
如果使用EntityFramework CodeFirst方法时您的类看起来像这种普通设置
[JsonIgnore]
Foo由于引用循环而无法序列化。
为了使API返回正确的序列化JSON,您必须在Bar类中为Foo-Property添加public class Bar
{
...
public int FooId {get;set;}
[JsonIgnore]
public Foo Foo {get;set;}
...
}
属性:
data.messages
这是假设您使用NewtonsoftJson作为序列化程序。
感谢@KiranChalla在@Ivans答案中的评论。这为我指明了正确的方向。