原文地址:https://www.cnblogs.com/elvinle/p/6252065.html

WebApi返回json格式字符串, 在网上能找到好几种方法, 其中有三种普遍的方法, 但是感觉都不怎么好.

先贴一下, 网上给的常用方法吧.

方法一:(改配置法)

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

  1. protected void Application_Start()
  2. {
  3. AreaRegistration.RegisterAllAreas();
  4. WebApiConfig.Register(GlobalConfiguration.Configuration);
  5. FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
  6. RouteConfig.RegisterRoutes(RouteTable.Routes);
  7. // 使api返回为json
  8. GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
  9. }

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

解决的方法是自定义返回类型(返回类型为HttpResponseMessage)

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

方法二:(万金油法)

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

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

为了不在每个接口中都反复写那几句代码,所以就封装为一个方法这样使用就方便多了。

  1. public static HttpResponseMessage toJson(Object obj)
  2. {
  3. String str;
  4. if (obj is String ||obj is Char)
  5. {
  6. str = obj.ToString();
  7. }
  8. else
  9. {
  10. JavaScriptSerializer serializer = new JavaScriptSerializer();
  11. str = serializer.Serialize(obj);
  12. }
  13. HttpResponseMessage result = new HttpResponseMessage { Content = new StringContent(str, Encoding.GetEncoding("UTF-8"), "application/json") };
  14. return result;
  15. }

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

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

先写一个处理返回的类:

  1. public class JsonContentNegotiator : IContentNegotiator
  2. {
  3. private readonly JsonMediaTypeFormatter _jsonFormatter;
  4.  
  5. public JsonContentNegotiator(JsonMediaTypeFormatter formatter)
  6. {
  7. _jsonFormatter = formatter;
  8. }
  9.  
  10. public ContentNegotiationResult Negotiate(Type type, HttpRequestMessage request, IEnumerable<MediaTypeFormatter> formatters)
  11. {
  12. var result = new ContentNegotiationResult(_jsonFormatter, new MediaTypeHeaderValue("application/json"));
  13. return result;
  14. }
  15. }

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

添加以下代码:

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

添加后代码如下:

  1. public static void Register(HttpConfiguration config)
  2. {
  3. config.Routes.MapHttpRoute(
  4. name: "DefaultApi",
  5. routeTemplate: "api/{controller}/{action}/{id}",
  6. defaults: new { id = RouteParameter.Optional }
  7. );
  8. var jsonFormatter = new JsonMediaTypeFormatter();
  9. config.Services.Replace(typeof(IContentNegotiator), new JsonContentNegotiator(jsonFormatter));
  10. }

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

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

以上三种方法, 就是我找到的比较普遍的方法了. 但是总觉得并不是那么好. 都要改这改那的.

还有一种方式能返回json格式字符串. 先看一下效果吧.

  1. public class HomeController : ApiController
  2. {
  3. [HttpGet]
  4. public JsonData Know(string msg)
  5. {
  6. msg = "WebApi 已接收到信息" ;
  7. return new JsonData() { Content = new List<string>() { "a", "b", "c" }, IsSuccess = true, Message = msg };
  8. }
  9.  
  10. public List<string> Get()
  11. {
  12. return new List<string>() { "a", "b", "c"};
  13. }
  14. }

看的出来, Know方法返回的是 json 格式的字符串, Get方法, 返回的是xml格式的.

从上面来看, 主要是返回值不一样. 那么JsonData里面有什么秘密呢?

  1. public class JsonData : ISerializable
  2. {
  3. #region 属性
  4.  
  5. /// <summary>
  6. /// 表示业务是否正常
  7. /// </summary>
      public bool IsSuccess { get; set; }
  8.  
  9. /// <summary>
  10. /// 返回消息,成功的消息和错误消息都在这里
  11. /// </summary>
      public string Message { get; set; }
  12.  
  13. /// <summary>
  14. /// 用于返回复杂结果
  15. /// </summary>
      public object Content { get; set; }
  16. #endregion
  17.  
  18. #region 方法
  19. /// <summary>
  20. /// 自定义序列化方法
  21. /// </summary>
  22. /// <param name="info"></param>
  23. /// <param name="context"></param>
  24. public void GetObjectData(SerializationInfo info, StreamingContext context)
  25. {
  26. // 运用info对象来添加你所需要序列化的项
  27. info.AddValue("IsSuccess", IsSuccess);
  28. info.AddValue("Message", Message);
  29. if (Content != null)
  30. {
  31. info.AddValue("Content", Convert.ChangeType(Content, Content.GetType()));
  32. }
  33. else
  34. {
  35. info.AddValue("Content", null);
  36. }
  37. }
  38.  
  39. public JsonData() { }
  40. #endregion
  41. }

这里主要是要实现 ISerializable 接口 .

可能有人注意到, 我访问api的时候, 路由模式和访问mvc是一样的, 其实这里很简单, 只需要在webapi路由注册哪里, 加入一个路由就可以了.

  1. config.Routes.MapHttpRoute(
  2. name: "DefaultApi1",
  3. routeTemplate: "api/{controller}/{action}",
  4. defaults: new { id = RouteParameter.Optional }
  5. );

这样, 就加入了一个路由匹配规则进去. 只不过, 需要在Know方法上面, 加上一些访问限制条件. 如httpget, 否则, 如果直接去访问, 是不可以的.

(转)WebApi返回Json格式字符串的更多相关文章

  1. WebApi返回Json格式字符串

    WebApi返回json格式字符串, 在网上能找到好几种方法, 其中有三种普遍的方法, 但是感觉都不怎么好. 先贴一下, 网上给的常用方法吧. 方法一:(改配置法) 找到Global.asax文件,在 ...

  2. webapi返回json格式优化

    一.设置webapi返回json格式 在App_Start下的WebApiConfig的注册函数Register中添加下面这代码 config.Formatters.Remove(config.For ...

  3. webapi返回json格式优化 转载https://www.cnblogs.com/GarsonZhang/p/5322747.html

    一.设置webapi返回json格式 在App_Start下的WebApiConfig的注册函数Register中添加下面这代码 1 config.Formatters.Remove(config.F ...

  4. webapi返回json格式,并定义日期解析格式

    1.webapi返回json格式 var json = config.Formatters.JsonFormatter; json.SerializerSettings.PreserveReferen ...

  5. WebAPI搭建(二) 让WebAPI 返回JSON格式的数据

    在RestFul风格盛行的年代,对接接口大多数人会选择使用JSON,XML和JSON的对比传送(http://blog.csdn.net/liaomin416100569/article/detail ...

  6. 如何让Asp.net webAPI返回JSON格式数据

    ASP.NET Web API 是新一代的 HTTP 網路服務開發框架,除了可以透過 Visual Studio 2012 快速開發外 (內建於 ASP.NET MVC 4 的 Web API 專案範 ...

  7. 指定webapi 返回 json 格式 ; GlobalConfiguration.Configuration.Formatters.Clear()

    因为 Internet Explorer 和 Firefox 发送了不同的 Accept 头,所以 web API 在响应里就发送了不同的内容类型.   解决方法,在 Global.asax的 App ...

  8. ASP.NET Core WebApi 返回统一格式参数(Json 中 Null 替换为空字符串)

    相关博文:ASP.NET Core WebApi 返回统一格式参数 业务场景: 统一返回格式参数中,如果包含 Null 值,调用方会不太好处理,需要替换为空字符串,示例: { "respon ...

  9. JSon_零基础_001_将布尔类型数组转换为JSon格式字符串,返回给界面

    将布尔类型数组转换为JSon格式字符串,返回给界面 需要导入包: 编写bean: package com.west.webcourse.po; /** * 第01步:编写bean类, * 下一步com ...

随机推荐

  1. 【KiCad】 如何给元件给元件的管脚加上划线?

    如何给元件给元件的管脚加上划线? 在一线元件需要注明一些引脚是低电位使能的. 比如这样. 每款 EDA 软件有不同的做法,有的是在前后使用 /,有的是给每个字母加上 /. KiCad 不一样,使用的是 ...

  2. Yuan先生的博客网址

    1 Web应用  https://www.cnblogs.com/yuanchenqi/articles/8869302.html 2 http协议 https://www.cnblogs.com/y ...

  3. 关注 硬件 发展, 转载一篇介绍 VHDL 的文章

    <VHDL学习笔记> https://www.eefocus.com/hrbeulvcaho/blog/12-11/289109_978e2.html VHDL 和  “可编程逻辑阵列”  ...

  4. spark机器学习

    多层感知器(MLP) from __future__ import print_function from pyspark.ml.classification import MultilayerPer ...

  5. js 去除字符串第一位逗号的方法

    <script type="text/javascript"> var s=',123456'; if (s.substr(0,1)==',') s=s.substr( ...

  6. TestNG.xml参数配置-如何控制部分执行@test方法

    如果在methods中标识了@test的方法,也可以在method中通过include和exclude来控制需要执行哪些方法 <include name="testMethod1&qu ...

  7. Redis select选择数据库

    Redis的功能真是强大,可以做数据库,可以做缓存. 今天发现Redis支持分隔操作空间,使得空间与空间之间互不影响. SELECT index 切换到指定的数据库,数据库索引号 index 用数字值 ...

  8. 大数据离线分析平台 用户数据Etl

    Etl目标  解析我们收集的日志数据,将解析后的数据保存到hbase中.这里选择hbase来存储数据的主要原因就是: hbase的宽表结构设计适合我们的这样多种数据格式的数据存储(不同event有不同 ...

  9. postfix配置spf认证和dkim认证

    1.为邮箱域名添加spf认证: 登录域名解析控制台添加txt记录: v=spf1 include:spf1.domain.com ~all spf1.domain.com  A记录解析到你的固定IP ...

  10. 总线读写---verilog代码

    总线读写---verilog代码 `timescale 1ns / 1ps ////////////////////////////////////////////////////////////// ...