JSON(JavaScript Object Notation,JavaScript 对象表示法),多么简单,不就是键值对嘛。

可是每次在前后端之间通过json作为参数传递,我都心烦意乱,甚至吓到面无人色。

何故?因为没搞懂咯。

现在也是一知半解。是时候做一个总结了。

1、前端传送给后端

$.ajax({
url: "/api/customview/SetTags?projectId=0&account=leftfist",
data: JSON.stringify(jsonObj),//这个JSON.stringify函数是js自带的,作用是将JSON对象序列化为字符串
dataType: "json",
type: "POST",
contentType: "application/json; charset=utf-8",
success: function (data) {//成功后回调函数
alert(data);
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert(textStatus + ": " + errorThrown);
}
});

上述例子中,URL含有参数,但json对象不在这些参数中。而是以提交的方式,放在消息体里面传送。http协议,前端到后端,是由请求行 + 请求报头 + 消息正文组成的,后端到前端,是由响应行 + 相应报头 + 消息正文组成。我估计,json对象,即放在消息正文中。

2、后端接收前端

后端,我这里以asp.net web api为例。

[csharp] view plaincopy
  1. [System.Web.Http.HttpPost]
  2. public bool SetTags(int projectId, string account, SetViewTag svt)
  3. {//此为对应前端的请求API:url: "/api/customview/SetTags?projectId=0&account=leftfist"
  4. List<ViewTag> lisVt = new List<ViewTag>();
  5. assemblyViewTagList(ref lisVt,svt.Updated,ViewTag.EChangeType.Update);
  6. assemblyViewTagList(ref lisVt, svt.Deleted, ViewTag.EChangeType.Remove);
  7. return customViewService.SetTags(projectId,account,lisVt);
  8. }
  9. void assemblyViewTagList(ref List<ViewTag> lisVt,string strJson,ViewTag.EChangeType ctype)
  10. {
  11. if (strJson.Length == 0) return;
  12. //JsonConvert.DeserializeObject<> 是Newtonsoft.Json 的方法,作用是将JSON字符串反序列化,转换回JSON对象
  13. //注意里面的泛型
  14. List<ViewTag> items = JsonConvert.DeserializeObject<List<ViewTag>>(strJson);
  15. foreach (ViewTag vt in items)
  16. {
  17. vt.ChangeType = (byte)ctype;
  18. lisVt.Add(vt);
  19. }
  20. }
  21. public class SetViewTag
  22. {
  23. public string Updated { get; set; }
  24. public string Deleted { get; set; }
  25. }
  26. public class ViewTag
  27. {
  28. public int ViewId { get; set; }
  29. public string Name { get; set; }
  30. public bool IsValid { get; set; }
  31. public int Seq { get; set; }
  32. public byte ChangeType { get; set; }
  33. public enum EChangeType : byte { NoChanged = 0,Update,Remove}
  34. }

3、前端接收后端

假设后端有WCF的接口:

[csharp] view plaincopy
  1. <span style="font-size:10px;">        static readonly DateTime dtZone = new DateTime(1970, 1, 1, 0, 0, 0);
  2. public Stream GetUTC()
  3. {
  4. DateTime utc = DateTime.Now.ToUniversalTime();
  5. return GetStream(String.Format(@"{{""data"":""{0}""}}", (long)utc.Subtract(dtZone).TotalMilliseconds));
  6. }</span>
[csharp] view plaincopy
  1. <span style="font-size:10px;">        /// <summary>
  2. /// 辅助方法,用于输出流
  3. /// </summary>
  4. /// <param name="str"></param>
  5. /// <returns></returns>
  6. private Stream GetStream(string str)
  7. {
  8. MemoryStream ms = new MemoryStream();
  9. StreamWriter sw = new StreamWriter(ms);
  10. sw.AutoFlush = true;
  11. sw.Write(str);
  12. ms.Position = 0;
  13. WebOperationContext.Current.OutgoingResponse.ContentType = "text/plain";
  14. return ms;
  15. }</span>

前端则有

[javascript] view plaincopy
  1. function getLocationTime(){
  2. var url = _webUrl + "/Attendance.svc/GetUTC";
  3. var xhr;
  4. xhr = new XMLHttpRequest();
  5. if (xhr) {
  6. xhr.onerror = function () { alert("erro"); };
  7. xhr.ontimeout = function () { alert("Time out"); };
  8. xhr.onload = function () {
  9. var data = $.parseJSON(xhr.responseText);
  10. serverDateTime = new Date();
  11. serverDateTime.setTime(data.data * 1);
  12. timeId = window.setInterval(getCalTimes, 1000);
  13. };
  14. xhr.open("get", url, true);
  15. //xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  16. xhr.send(null);
  17. }
  18. else {
  19. alert("Failed to create");
  20. }
  21. }

前端这里使用了 XMLHttpRequest(),主要是照顾IE。如果用纯ajax,可以:

[javascript] view plaincopy
  1. $.ajax({
  2. url: _webUrl + "/Attendance.svc/GetUTC";,
  3. type: "GET",
  4. success: function (data) {//成功后回调函数
  5. //假如这个data是json字符串,则 obj 得到json对象
  6. var obj = eval("(" + data + ")");
  7. },
  8. error: function (XMLHttpRequest, textStatus, errorThrown) {
  9. alert(textStatus + ": " + errorThrown);
  10. }
  11. });

3、前端接收后端-2

asp.net web api 默认的结果传送方式是XML。但可以设置为JSON。方法为在WebApiConfig里加入一句:

[csharp] view plaincopy
  1. public static class WebApiConfig
  2. {
  3. public static void Register(HttpConfiguration config)
  4. {
  5. // Web API 路由
  6. config.MapHttpAttributeRoutes();
  7. config.Routes.MapHttpRoute(
  8. name: "DefaultApi",
  9. routeTemplate: "api/{controller}/{action}/{id}",
  10. defaults: new { id = RouteParameter.Optional }
  11. );
  12. config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));//改为JSON方式
  13. }
  14. }

如此,在服务端那些List<>之类只有服务端才能明白的东西,在前端接收到时一律是JSON。

JSON参数的更多相关文章

  1. JSON参数解析工具类

    /// <summary> /// 解析JSON参数 /// </summary> public class JSONParser { JObject jObj = null; ...

  2. Servlet端 接收不到4096,8192长度的JSON参数

    Servlet端的日志显示,客户端传过来的JSON参数是空值. 但是在客户端的日志显示,已将JSON参数传送过去. 经调查发现,加减1位后的JSON参数均可以正常传送. 只有8192,4096长度的J ...

  3. c# HttpWebRequest 模拟HTTP post 传递JSON参数

    //HTTP post   JSON 参数        private string HttpPost(string Url, Object ticket)        {            ...

  4. python接口自动化-传 json 参数

    一.post请求有两种方法传json参数: 1.传json参数(自动转 json ) 2.传data参数(需 json 转换) 代码参考: payload = { "Jodie": ...

  5. SpringBoot配置Swagger实例(POST接收json参数)

    工程目录结构: 首先,引入jar包,只需要以下两个即可 <dependency> <groupId>io.springfox</groupId> <artif ...

  6. Spring boot中自定义Json参数解析器

    转载请注明出处... 一.介绍 用过springMVC/spring boot的都清楚,在controller层接受参数,常用的都是两种接受方式,如下 /** * 请求路径 http://127.0. ...

  7. wcf json参数返回失败问题

    问题: 最近写了一个接口,提示连接失败,于是在本地发布了一下,然后模拟post请求进行本地调试,发现能正常进入接口,中间也没问题,一直走到最后一步return时,也能return,但是就是返回不了数据 ...

  8. SpringMVC接受JSON参数详解及常见错误总结我改

    SpringMVC接受JSON参数详解及常见错误总结 最近一段时间不想使用Session了,想感受一下Token这样比较安全,稳健的方式,顺便写一个统一的接口给浏览器还有APP.所以把一个练手项目的前 ...

  9. SpringMVC接受JSON参数详解及常见错误总结

    SpringMVC接受JSON参数详解及常见错误总结 SpringMVC接受JSON参数详解及常见错误总结 最近一段时间不想使用Session了,想感受一下Token这样比较安全,稳健的方式,顺便写一 ...

  10. C# ContentType: "application/json" 请求方式传json参数问题

    处理Http请求时遇到的ContentType为application/json方式,记录下这种Post请求方式下如何传json参数: var request = (HttpWebRequest)We ...

随机推荐

  1. linux内核中GNU C和标准C的区别

    linux内核中GNU C和标准C的区别 今天看了一下午的linux内核编程方面的内容,发现linux 内核中GNU C与标准C有一些差别,特记录如下: linux 系统上可用的C编译器是GNU C编 ...

  2. BZOJ 3876 支线剧情 有源汇有上下界最小费用可行流

    题意: 给定一张拓扑图,每条边有边权,每次只能从第一个点出发沿着拓扑图走一条路径,求遍历所有边所需要的最小边权和 分析: 这道题乍一看,可能会想到什么最小链覆盖之类的,但是仔细一想,会发现不行,一是因 ...

  3. BZOJ4873 LuoguP3749 寿司餐厅

    题面太长,请诸位自行品尝—>寿司餐厅 分析: 首先题目中给了限制条件,假如选了D(i,j)(i<j),那么也就选了D(i+1,j)和D(i,j-1)两个点. 于是我们一下就明白了,哦,最大 ...

  4. LG-P1311选择客栈

    题目 暴力十分好想但你写不出来qwq 正解十分好写但你想不出来qaq 我们先读题,发现k其实没什么用 同时暴力枚举两个客栈的话会超时,所以只能同时枚举一个.我们枚举第二个客栈,然后用第二个客栈反推出前 ...

  5. CentOS7-wget命令

    Wget主要用于下载文件,在安装软件时会经常用到,以下对wget做简单说明.转载自:https://www.cnblogs.com/lxz88/p/6278268.html 1.下载单个文件:wget ...

  6. Linux 关于umount

    场景:linux下挂载过去的代码目录编译失败.怀疑本地磁盘空间不足问题导致.解决方法:卸载重新挂载. 操作:卸载时报错: 解决方法: 1.umount, 老是提示:device is busy, 服务 ...

  7. 88-On Balance Volume 能量潮指标.(2015.7.4)

    On Balance Volume 能量潮指标 ~计算方法: 如果当天的收盘价高于昨天的话,那么:OBV(i) = OBV(i-1)+VOLUME(i) 如果当天的收盘价低于昨天的话,那么:OBV(i ...

  8. 从Hadoop框架讨论大数据

    [Hadoop是什么?] 1)Hadoop 是一个由 Apache 基金会所开发的分布式系统基础架构. 2)主要解决,海量数据的存储和海量数据的分析计算问题. 3)广义上来说,HADOOP 通常是指一 ...

  9. Directory获取方式

    1) FSDirectory.open FSDirectory.open()会以最合适的方式来获取一个Directory对象. 2) RAMDirectory 可以将磁盘中的索引加载到内存中,访问速度 ...

  10. 基于HttpClient4.5.2实现的HttpClient工具类

    1.maven依赖: <dependency> <groupId>org.apache.commons</groupId> <artifactId>co ...