C# web api返回类型设置为json的两种方法


web api写api接口时默认返回的是把你的对象序列化后以XML形式返回,那么怎样才能让其返回为json呢,下面就介绍两种方法:
方法一:(改配置法)

找到Global.asax文件,在Application_Start()方法中添加一句:

复制代码 代码如下:

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

修改后:
复制代码 代码如下:

protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
// 使api返回为json
GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
}

这样返回的结果就都是json类型了,但有个不好的地方,如果返回的结果是String类型,如123,返回的json就会变成"123";

解决的方法是自定义返回类型(返回类型为HttpResponseMessage)
复制代码 代码如下:

public HttpResponseMessage PostUserName(User user)
{
String userName = user.userName;
HttpResponseMessage result = new HttpResponseMessage { Content = new StringContent(userName,Encoding.GetEncoding("UTF-8"), "application/json") };
return result;
}

方法二:(万金油法)

方法一中又要改配置,又要处理返回值为String类型的json,甚是麻烦,不如就不用web api中的的自动序列化对象,自己序列化后再返回
复制代码 代码如下:

public HttpResponseMessage PostUser(User user)
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
string str = serializer.Serialize(user);
HttpResponseMessage result = new HttpResponseMessage { Content = new StringContent(str, Encoding.GetEncoding("UTF-8"), "application/json") };
return result;
}

方法二是我比较推荐的方法,为了不在每个接口中都反复写那几句代码,所以就封装为一个方法这样使用就方便多了。
复制代码 代码如下:

public static HttpResponseMessage toJson(Object obj)
{
String str;
if (obj is String ||obj is Char)
{
str = obj.ToString();
}
else
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
str = serializer.Serialize(obj);
}
HttpResponseMessage result = new HttpResponseMessage { Content = new StringContent(str, Encoding.GetEncoding("UTF-8"), "application/json") };
return result;
}

方法三:(最麻烦的方法)

方法一最简单,但杀伤力太大,所有的返回的xml格式都会被毙掉,那么方法三就可以只让api接口中毙掉xml,返回json

先写一个处理返回的类:
复制代码 代码如下:

public class JsonContentNegotiator : IContentNegotiator
{
private readonly JsonMediaTypeFormatter _jsonFormatter;

public JsonContentNegotiator(JsonMediaTypeFormatter formatter)
{
_jsonFormatter = formatter;
}

public ContentNegotiationResult Negotiate(Type type, HttpRequestMessage request, IEnumerable<MediaTypeFormatter> formatters)
{
var result = new ContentNegotiationResult(_jsonFormatter, new MediaTypeHeaderValue("application/json"));
return result;
}
}

找到App_Start中的WebApiConfig.cs文件,打开找到Register(HttpConfiguration config)方法

添加以下代码:
复制代码 代码如下:

var jsonFormatter = new JsonMediaTypeFormatter();
config.Services.Replace(typeof(IContentNegotiator), new JsonContentNegotiator(jsonFormatter));

添加后代码如下:
复制代码 代码如下:

public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
var jsonFormatter = new JsonMediaTypeFormatter();
config.Services.Replace(typeof(IContentNegotiator), new JsonContentNegotiator(jsonFormatter));
}

方法三如果返回的结果是String类型,如123,返回的json就会变成"123",解决方法同方法一。

其实web api会自动把返回的对象转为xml和json两种格式并存的形式,方法一与方法三是毙掉了xml的返回,而方法二是自定义返回。



相关阅读:
php实现查看邮件是否已被阅读的方法
jQuery统计上传文件大小的方法
当用户退出点击浏览器后退仍可回到原来页面的解决方案
C#将jpg转换为pdf的方法
JavaScript实现的GBK、UTF8字符串实际长度计算函数
本月底将停售 Win8/Win8.1专业版升级包和介质包
Win8.1更新时提示错误代码为80246010的解决方案
C语言练习题:自由落体的小球简单实例
深入剖析Android系统中Service和IntentService的区别
很酷的HTML5电子书翻页动画特效
C#生成条形码图片的简单方法
iOS应用开发中监听键盘事件的代码实例小结
详解Linux系统中的SysVinit的机制
iOS中使用schema协议调用APP和使用iframe打开APP的例子
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 三江口-辽阳 大虎山-新余 太平川-海坨子 兰棱-聊城 恩施-石门县北 锦州-滁州北 全州南-分宜 梁山-宜春 镇赉-图强 商丘-青岛北 大板-青铜峡 蓬安-延安 玉林-黎塘 黄村-深州 松坝-蒙渡 南阳-长治 民权北-荣成 武山-高密 瑞安-沧州西 灯塔-老莱 郭家店-大石桥 宣威-商丘南 广州南-许昌东 徐州-贵港 凯里南-邵阳北 劲松-新天 新化-青田 赣州-武隆 宋-姜家 劳动屯-海坨子 呼和浩特-富县东 北碚-达拉特西 茂舍祖-革居 平原-镇江 凭祥-江西村 合阳北-桐梓 商丘-开封北 鄂尔多斯-江津 湘潭北-济南西 瑞昌-汉川 临河-北京 韶关东-北京西 无锡-水家湖 渠县-长葛 尚志-大庆西 新场-三元坝 蔡家沟-八面城 公主埂-兴和 萨拉齐-林东 四平-长山屯 肃宁-四平 资溪-内乡 虢镇-葫芦岛北 于都-台州 徐州-嘉善 红峰-乐跃 双吉-图们北 雁荡山-鳌江 邢台东-清远 雷州-桂林北 十堰-哈尔滨西 库都尔-根河 嘉峪关-饶阳 昌图西-唐山 松江镇-北岗 徐闻-襄阳 克东-锦州 南丰-恩施 永川东-垫江 太原-月山 清涧县-萨拉齐 莱阳-兰考南 石家庄北-韶关东 万发屯-赵光 沈阳北-阿城 嘉兴南-瑞安 朝阳镇-北京 霸州-安顺 溆浦南-韶山南 上饶-梧州 顺德拓特开关_顺德拓特开关
佛山市顺德区-工作好找么
1月20日座广州到宜昌火车列车票多少钱
从深圳南山去贵州贵阳怎么做车方便好 有没有直达火车列车
内蒙赤峰地区能收到CMMB电视吗
济南到柳州列车火车经过多少站?分别经过哪些站
请问从河源到惠州南县的车每天都有吗?一天几次,什么时间出发
从沧州火车站或汽车站到沧州出入境管理局怎样走
那位知道青州哪里有改装摩托车疝气灯的,告诉我下,谢谢,给
武汉到庐山 10.1自助游好还是报团好,费用如何
长春到磐石最晚的汽车是几点的?
辽宁的朝阳到湖南的郴州有多远多少公里
从扬州的火车列车站到凤凰岛怎么走
石家庄从火车列车站坐几路车到外经贸学院
请问,山西阜平到五台山那段高速通车了吗
我想问一下,威海的威海港公园,翠屏楼公园,奥林公园……还...
内乡县火车列车站的售票时间?
五一去西安北京出发
列车k79,从新余到曲靖票价是多少(硬座和卧铺)
北京开车到泌阳怎么坐车
在西安办托运行李,是否行李与人是同一趟火车
关于第二课堂的资料,上课要用(包括调查问卷、成果演讲稿)
攀枝花到郑州列车火车票预定电话
呼伦贝尔草原什么时候牧草最茂盛
从石家庄驾车怎么去河北省三河市燕郊经济技术开发区迎宾北路4
从汤山到南京火车列车站的公交南汤线最晚一趟是几点
南泉到西彭公交车
从包头到石家庄坐列车火车要几天
陕西安康到广州的飞机票价
急需23-26号从温州到怀化的火车票

Copyright © 2016 phpStudy |