MVC 4 - Web Api和JSON?

8

我正在学习MVC 4的Web API,但是默认格式让我有些困惑。我希望API数据以JSON格式返回,但实际上返回的是XML格式。根据MVC 4入门视频(链接为:http://www.asp.net/web-api/videos/getting-started/your-first-web-api),默认应该是JSON格式。但是当我创建一个新的Web Api项目并运行示例时,却得到了这个结果:

<ArrayOfstring><string>value1</string><string>value2</string></ArrayOfstring>

我一直在尝试将其转换为JSON,但似乎有很多误解。比如:
  1. 如果我在内容类型标头中添加"application/json",它应该返回JSON。但这并不起作用,我怀疑我的标头变量名称不正确,因为我找不到要使用的确切名称。我已经尝试过在请求标头中使用"Content-Type"和"contentType",但没有成功。此外,我希望默认情况下输出JSON,而不是根据标头信息。
  2. 如果我创建一个JsonFormatter并将其添加到Application_Start GlobalConfiguration.Configuration.Formatters.Insert(0, new JsonNetFormatter(serializerSettings));中,它应该可以解决问题。但我发现这个方法已经过时了,因为没有一个示例能够运行。
我该怎么做,最好是一些简单的方式,以默认方式输出数据以JSON格式?

2
不要被浏览器所迷惑。Chrome和FF会将JSON数据呈现为XML。请在Fiddler中仔细检查应用程序输出的内容。 - Nick
1
你所寻找的正确的头部拼写是“Accept”。Content-type 是用来描述正在发送的内容,而不是你想要发送的内容。JSON 格式化程序已经作为默认的格式化程序集合之一。 - Darrel Miller
哇,我从未想到这可能是浏览器问题。我一直在使用FireFox,真蠢! - Levitikon
6个回答

19

将以下内容添加到GLOBAL.ASAX以使响应为application/json

GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();

因此,上下文中应该看起来像这样:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);

    BundleTable.Bundles.RegisterTemplateBundles();
    GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
}

或者,如果你需要保留XML作为媒体类型,你可以编辑App_Start/WebApiConfig.cs

config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html") );

这使得JSON成为Web浏览器的默认响应,但返回text/html

来源


完美,解决得非常好!从来没有想过这也可能是浏览器问题。 - Levitikon

4
我希望API数据是以JSON格式返回的,但实际返回的是XML。你是如何访问webapi的?你是使用Chrome来访问你的webapi服务吗?Chrome将application/xml作为Accept标头添加到请求中... 。如果我在内容类型标头中添加"application/json",它应该返回JSON。尝试设置'Accept'标头。如果我创建一个JsonFormatter并将其添加到Application_Start GlobalConfiguration.Configuration.Formatters.Insert(0, new JsonNetFormatter(serializerSettings))中,它应该可以解决问题。但我发现这已经过时了,因为没有一个例子能够运行。如果请求的接受标头是application/xml,则内容协商仍将选择XmlMediaTypeFormatter,并返回application/xml。还有一件事,JSON的格式化程序称为JsonMediaTypeFormatter,它已经在Formatters集合的位置0上了。

0
引用Felipe Leusin的话(如何在Chrome浏览器中使ASP.NET Web API返回JSON而不是XML?
我只需在我的MVC Web API项目的App_Start/WebApiConfig.cs类中添加以下内容。
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html") );

这可以确保在大多数查询中获得json,但是当您发送text/xml时,您可以获得xml。

如果您需要将响应Content-Type设置为application/json,请查看Todd在下面的答案:https://dev59.com/wWkw5IYBdhLWcg3wg6ug#20556625


0

你也可以在GLOBAL.ASAX文件中写入以下内容

config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json"));

这对我也行。


0

您不需要移除XML支持以获取JSON响应。对于GET请求,您应该设置Accept-header而不是Content-Type header。对于其他HTTP动词,则取决于具体情况。详细解释请参见此处。

http://blogs.msdn.com/b/kiranchalla/archive/2012/02/25/content-negotiation-in-asp-net-mvc4-web-api-beta-part-1.aspx

奖励: 使用Google Chrome的Postman插件测试REST API。强烈推荐 :)

https://chrome.google.com/webstore/detail/postman-rest-client/fdmmgilgnpjigdojojpjoooidkmcomcm?hl=en


0
如果您只想要JSON,则清除格式化程序集合中的所有默认值,然后再添加JSON。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接