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. [PyTorch] rnn,lstm,gru中输入输出维度

    本文中的RNN泛指LSTM,GRU等等 CNN中和RNN中batchSize的默认位置是不同的. CNN中:batchsize的位置是position 0. RNN中:batchsize的位置是pos ...

  2. Java中Date类型的工具类

    package com.mytripod.util; import java.text.DateFormat; import java.text.SimpleDateFormat; import ja ...

  3. 19Spring返回通知&异常通知&环绕通知

    在前置通知和后置通知的基础上加上返回通知&异常通知&环绕通知 代码: package com.cn.spring.aop.impl; //加减乘除的接口类 public interfa ...

  4. linux 命令终端提示符显示-bash-4.2#解决方法

    原地址:http://blog.csdn.net/liulihui1988/article/details/52796395 终端提示符显示的是-bash-4.2# 而不是root@主机名 + 路径的 ...

  5. Python中的列表(3)

    我们创建的列表元素的顺序是无法预测的,因为我们无法控制用户提供数据的顺序. 为了组织列表中的元素,所以Python帮我们提供一些方法用来排序列表中的元素. 1.方法 sort() 可以对列表永久性排序 ...

  6. Far Relative’s Problem (贪心 计算来的最多客人)

    Description Famil Door wants to celebrate his birthday with his friends from Far Far Away. He has n  ...

  7. Apache Ambari 2.7.3.0 离线安装

    1. 准备 (内存 3G 硬盘 40G) 0)设置ssh无密码 ssh-keygencat id_rsa.pub >> authorized_keyschmod 700 ~/.sshchm ...

  8. 全文搜索(AC-1)-互联网信息过载问题

    什么是信息过载? 信息检索技术是什么? 信息过滤技术是什么?

  9. 算法(1):查找&排序

    算法(Algorithm):一个计算过程,解决问题的方法 程序 = 数据结构+算法 时间复杂度: 当算法过程中出现循环折半的时候,复杂度式子中会出现 O(logn) 时间复杂度小结: 1. 时间复杂度 ...

  10. Spring boot 搭配 JPA 生成表注释 和 字段注释

    原文地址:https://blog.csdn.net/qq_39996837/article/details/84717748 由于在数据库表反向生成过程中呢,需要通过jpa自动生成表,并且这个表必须 ...