(转)WebApi返回Json格式字符串
原文地址:https://www.cnblogs.com/elvinle/p/6252065.html
WebApi返回json格式字符串, 在网上能找到好几种方法, 其中有三种普遍的方法, 但是感觉都不怎么好.
先贴一下, 网上给的常用方法吧.
方法一:(改配置法)
找到Global.asax文件,在Application_Start()方法中添加一句:

- 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;
- var result = new HttpResponseMessage{ Content = new StringContent(userName,Encoding.GetEncoding("UTF-8"), "application/json")};
- return result;
- }
方法二:(万金油法)
方法一中又要改配置,又要处理返回值为String类型的json,甚是麻烦,不如就不用webapi中的的自动序列化对象,自己序列化后再返回

- 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",解决方法同方法一。
其实WebApi会自动把返回的对象转为xml和json两种格式并存的形式,方法一与方法三是毙掉了xml的返回,而方法二是自定义返回。
以上三种方法, 就是我找到的比较普遍的方法了. 但是总觉得并不是那么好. 都要改这改那的.
还有一种方式能返回json格式字符串. 先看一下效果吧.

- public class HomeController : ApiController
- {
- [HttpGet]
- public JsonData Know(string msg)
- {
- msg = "WebApi 已接收到信息" ;
- return new JsonData() { Content = new List<string>() { "a", "b", "c" }, IsSuccess = true, Message = msg };
- }
- public List<string> Get()
- {
- return new List<string>() { "a", "b", "c"};
- }
- }

看的出来, Know方法返回的是 json 格式的字符串, Get方法, 返回的是xml格式的.
从上面来看, 主要是返回值不一样. 那么JsonData里面有什么秘密呢?

- public class JsonData : ISerializable
- {
- #region 属性
- /// <summary>
- /// 表示业务是否正常
- /// </summary>
public bool IsSuccess { get; set; }- /// <summary>
- /// 返回消息,成功的消息和错误消息都在这里
- /// </summary>
public string Message { get; set; }- /// <summary>
- /// 用于返回复杂结果
- /// </summary>
public object Content { get; set; }- #endregion
- #region 方法
- /// <summary>
- /// 自定义序列化方法
- /// </summary>
- /// <param name="info"></param>
- /// <param name="context"></param>
- public void GetObjectData(SerializationInfo info, StreamingContext context)
- {
- // 运用info对象来添加你所需要序列化的项
- info.AddValue("IsSuccess", IsSuccess);
- info.AddValue("Message", Message);
- if (Content != null)
- {
- info.AddValue("Content", Convert.ChangeType(Content, Content.GetType()));
- }
- else
- {
- info.AddValue("Content", null);
- }
- }
- public JsonData() { }
- #endregion
- }

这里主要是要实现 ISerializable 接口 .
可能有人注意到, 我访问api的时候, 路由模式和访问mvc是一样的, 其实这里很简单, 只需要在webapi路由注册哪里, 加入一个路由就可以了.
- config.Routes.MapHttpRoute(
- name: "DefaultApi1",
- routeTemplate: "api/{controller}/{action}",
- defaults: new { id = RouteParameter.Optional }
- );
这样, 就加入了一个路由匹配规则进去. 只不过, 需要在Know方法上面, 加上一些访问限制条件. 如httpget, 否则, 如果直接去访问, 是不可以的.
(转)WebApi返回Json格式字符串的更多相关文章
- WebApi返回Json格式字符串
WebApi返回json格式字符串, 在网上能找到好几种方法, 其中有三种普遍的方法, 但是感觉都不怎么好. 先贴一下, 网上给的常用方法吧. 方法一:(改配置法) 找到Global.asax文件,在 ...
- webapi返回json格式优化
一.设置webapi返回json格式 在App_Start下的WebApiConfig的注册函数Register中添加下面这代码 config.Formatters.Remove(config.For ...
- webapi返回json格式优化 转载https://www.cnblogs.com/GarsonZhang/p/5322747.html
一.设置webapi返回json格式 在App_Start下的WebApiConfig的注册函数Register中添加下面这代码 1 config.Formatters.Remove(config.F ...
- webapi返回json格式,并定义日期解析格式
1.webapi返回json格式 var json = config.Formatters.JsonFormatter; json.SerializerSettings.PreserveReferen ...
- WebAPI搭建(二) 让WebAPI 返回JSON格式的数据
在RestFul风格盛行的年代,对接接口大多数人会选择使用JSON,XML和JSON的对比传送(http://blog.csdn.net/liaomin416100569/article/detail ...
- 如何让Asp.net webAPI返回JSON格式数据
ASP.NET Web API 是新一代的 HTTP 網路服務開發框架,除了可以透過 Visual Studio 2012 快速開發外 (內建於 ASP.NET MVC 4 的 Web API 專案範 ...
- 指定webapi 返回 json 格式 ; GlobalConfiguration.Configuration.Formatters.Clear()
因为 Internet Explorer 和 Firefox 发送了不同的 Accept 头,所以 web API 在响应里就发送了不同的内容类型. 解决方法,在 Global.asax的 App ...
- ASP.NET Core WebApi 返回统一格式参数(Json 中 Null 替换为空字符串)
相关博文:ASP.NET Core WebApi 返回统一格式参数 业务场景: 统一返回格式参数中,如果包含 Null 值,调用方会不太好处理,需要替换为空字符串,示例: { "respon ...
- JSon_零基础_001_将布尔类型数组转换为JSon格式字符串,返回给界面
将布尔类型数组转换为JSon格式字符串,返回给界面 需要导入包: 编写bean: package com.west.webcourse.po; /** * 第01步:编写bean类, * 下一步com ...
随机推荐
- 【KiCad】 如何给元件给元件的管脚加上划线?
如何给元件给元件的管脚加上划线? 在一线元件需要注明一些引脚是低电位使能的. 比如这样. 每款 EDA 软件有不同的做法,有的是在前后使用 /,有的是给每个字母加上 /. KiCad 不一样,使用的是 ...
- Yuan先生的博客网址
1 Web应用 https://www.cnblogs.com/yuanchenqi/articles/8869302.html 2 http协议 https://www.cnblogs.com/y ...
- 关注 硬件 发展, 转载一篇介绍 VHDL 的文章
<VHDL学习笔记> https://www.eefocus.com/hrbeulvcaho/blog/12-11/289109_978e2.html VHDL 和 “可编程逻辑阵列” ...
- spark机器学习
多层感知器(MLP) from __future__ import print_function from pyspark.ml.classification import MultilayerPer ...
- js 去除字符串第一位逗号的方法
<script type="text/javascript"> var s=',123456'; if (s.substr(0,1)==',') s=s.substr( ...
- TestNG.xml参数配置-如何控制部分执行@test方法
如果在methods中标识了@test的方法,也可以在method中通过include和exclude来控制需要执行哪些方法 <include name="testMethod1&qu ...
- Redis select选择数据库
Redis的功能真是强大,可以做数据库,可以做缓存. 今天发现Redis支持分隔操作空间,使得空间与空间之间互不影响. SELECT index 切换到指定的数据库,数据库索引号 index 用数字值 ...
- 大数据离线分析平台 用户数据Etl
Etl目标 解析我们收集的日志数据,将解析后的数据保存到hbase中.这里选择hbase来存储数据的主要原因就是: hbase的宽表结构设计适合我们的这样多种数据格式的数据存储(不同event有不同 ...
- postfix配置spf认证和dkim认证
1.为邮箱域名添加spf认证: 登录域名解析控制台添加txt记录: v=spf1 include:spf1.domain.com ~all spf1.domain.com A记录解析到你的固定IP ...
- 总线读写---verilog代码
总线读写---verilog代码 `timescale 1ns / 1ps ////////////////////////////////////////////////////////////// ...