我刚刚开始使用MVC4Web API,我似乎误解了它的工作原理。
在Web API之前,我有一个简单的MVC操作方法,如下所示:
public JsonResult User()
{
return Json(new
{
firstName = "Joe",
lastName = "Jacobs",
email = "joe.jacobs@gmail.com"
});
}
这将会很好地工作。在新的web API控制器中,我正在尝试做类似的事情。
public object User()
{
return new
{
firstName = "Joe",
lastName = "Jacobs",
email = "joe.jacobs@gmail.com"
}
}
此操作失败,并显示序列化错误:
'ObjectContent`1‘类型无法序列化内容类型'application/xml;charset=utf-8’的响应正文。
内部异常:
类型'<>f__AnonymousType1`3System.String,System.String,System.String‘不能序列化。考虑用DataContractAttribute属性标记它,并用DataMemberAttribute属性标记要序列化的所有成员。如果类型是集合,请考虑使用CollectionDataContractAttribute标记它。有关其他支持的类型,请参阅微软.NET框架文档。
关于从API控制器返回匿名类型,我有什么不理解的地方?
发布于 2013-02-20 00:29:18
如果你看一下Fiddler (这里的示例我使用的是Firefox)
默认情况下,来自浏览器的请求将接受application/xml,而不是application/json
但是,您可以通过添加一个头来从Fiddler创建假请求:
Accept: application/json
看起来不错
从link
序列化程序不支持匿名类型或JObject实例。如果将这些特性用于JSON数据,则应该从管道中删除XML格式化程序,如本文后面所述。
如何删除XmlFormatter
var configuration = GlobalConfiguration.Configuration;
configuration.Formatters.Remove(configuration.Formatters.XmlFormatter);
发布于 2013-12-13 21:51:09
您也可以使用JsonMediaTypeFormatter,这样就不需要JSONObject和相关类了。然后你可以在你的控制器类中返回一个动态类型。
public static void Register(HttpConfiguration config)
{
config.Formatters.Clear();
config.Formatters.Add(new JsonMediaTypeFormatter());
config.MapHttpAttributeRoutes();
}
public class YourController : ApiController
{
[HttpGet, Route("getstuff/{stuffId}")]
public dynamic Get(string stuffId)
{
var stuff = Model.Stuff.Get(stuffId);
return new {
success= stuff != null,
stuffId = stuff.Id,
name = stuff.Name
};
}
}
如果您还想支持Jsonp,您可以继承JsonMediaTypeFormatter并创建自己的JsonpMediaTypeFormatter (也可以在stackoverflow:https://stackoverflow.com/a/12492552/1138266上找到)。
发布于 2016-12-01 12:43:52
我发现API不喜欢返回原始列表。相反,我必须创建一个对象,并将该对象的值设置为我的列表;请参阅第一个return语句。
示例:
public IHttpActionResult GetMessages(int messageFeedId, int lastMessageId) {
List<Message> messageDomainObjects = MessageService.GetMessages(messageFeedId, lastMessageId);
if (messageDomainObjects.Any())
{
var messages = messageDomainObjects.Select(m => new MessageModel(
m.Id,
m.Message,
m.CreatedDate,
m.IsActive,
new UserModel(
m.User.Id,
m.User.FirstName,
m.User.LastName
)
));
return Ok(new { messages = messages });
}
else
{
return Ok(new { });
}
}
https://stackoverflow.com/questions/14962134
复制相似问题