首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从MVC 4 Web Api返回匿名类型失败,并出现序列化错误

从MVC 4 Web Api返回匿名类型失败,并出现序列化错误
EN

Stack Overflow用户
提问于 2013-02-20 00:14:52
回答 4查看 11.6K关注 0票数 18

我刚刚开始使用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控制器返回匿名类型,我有什么不理解的地方?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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);
票数 33
EN

Stack Overflow用户

发布于 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上找到)。

票数 3
EN

Stack Overflow用户

发布于 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 { });
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14962134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档