JSON操作

引子

最近在做一个表单页面,大概是这个样子的

这里打算用一个JSON存储所有的信息,我们可以理解为,所有东西都存在一个字符串里面。方便,快捷,易读,数据库操作也方便了。甚至,可以将很多不同页面的数据存在同一个数据库同一个表内。

比如说,本页面的JSON格式如下:

  1. {
  2. "其他信息": [
  3. {
  4. "title": "修改时间",
  5. "text": "2015-8-12 10:00"
  6. },
  7. {
  8. "title": "作者",
  9. "text": "zztdan"
  10. }
  11. ],
  12. "管理目标": [
  13. {
  14. "title": "XXXXXXXX",
  15. "text": "XXXXXXXXXXXXXXXXXXXXXXXXXXX"
  16. } ],
  17. "各车间科室目标": [
  18. {
  19. "title": "XXXXX",
  20. "text": "X1XXXXX0XXX2XXXXXXXXXXX80XXX3XXXXXXXXX0XXX4XXXXXXXXXX100%X"
  21. },
  22. {
  23. "title": "XXXX",
  24. "text": "X1XXXXXXXXXXX80XXX2XXXXXXXXX0XXX3XXXXXXXXXX100%X"
  25. } ]
  26. }

一、JS里面定义类

为了方便网站所有页面操作,我将所有的有关JSON的函数全部写出,列在一个js里面,进行调用。这样方便,通用性也好。

首先,我们放在js里面,最好写成类(或者说命名空间)的形式,而不是散装的函数。这样不容易引起冲突。

先来看如何在JS文件里写类:

  1. JSONfunc = function ()
  2. {
  3. var _privatestr="privatestr";//私有化的属性
  4. var _prinumber=1234;//私有化的属性
  5. this.publicstr="publicstr";//公共的属性
  6. this.func1=function(){};//公共的函数
  7. }
  8.  
  9. JSONfunc.staticstr="staticstr";//类似于静态属性
  10.  
  11. JSONfunc.LoadJSON = function (_url)//类似于静态函数
  12. {
  13. var ret;
  14. $.ajax({
  15. type: "get",
  16. url: _url,
  17. dataType: "json",
  18. async: false,
  19. success: function (jsonobj)
  20. {
  21. ret = jsonobj;
  22. },
  23. error: function (err)
  24. {
  25. debugger;
  26. ret = err;
  27. }
  28. });
  29. return ret;
  30. }

将函数,属性等写在类定义里面,则要使用这些函数,类,必须先实例化该函数,我们对比:

  1. JSONfunc = function ()
  2. { }
  3.  
  4. JSONfunc.LoadJSON = function (_url)
  5. {
  6. var ret;
  7. $.ajax({
  8. type: "get",
  9. url: _url,
  10. dataType: "json",
  11. async: false,
  12. success: function (jsonobj)
  13. {
  14. ret = jsonobj;
  15. },
  16. error: function (err)
  17. {
  18. debugger;
  19. ret = err;
  20. }
  21. });
  22. return ret;
  23. }
  24.  
  25. //-----------------------------------------------------------------------
  26.  
  27. JSONfunc = function ()
  28. {
  29.  
  30. JSONfunc.LoadJSON = function (_url)
  31. {
  32. var ret;
  33. $.ajax({
  34. type: "get",
  35. url: _url,
  36. dataType: "json",
  37. async: false,
  38. success: function (jsonobj)
  39. {
  40. ret = jsonobj;
  41. },
  42. error: function (err)
  43. {
  44. debugger;
  45. ret = err;
  46. }
  47. });
  48. return ret;
  49. }
  50.  
  51. }

这两种命名方式,前者可以直接调用JSONfunc.LoadJSON,后者必须先var kk=new JSONfunc();才能调用kk.LoadJSON。其调用方法和C#,JAVA里面的类规则是一致的。而在类定义里面通过var等方式定义的属性,函数(而不是用this),则相当于是private的,外部无论如何也无法访问。

二、从文件中读取类

  1. JSONfunc.LoadJSON = function (_url)
  2. {
  3. var ret;
  4. $.ajax({
  5. type: "get",
  6. url: _url,
  7. dataType: "json",
  8. async: false,
  9. success: function (jsonobj)
  10. {
  11. ret = jsonobj;
  12. },
  13. error: function (err)
  14. {
  15. debugger;
  16. ret = err;
  17. }
  18. });
  19. return ret;
  20. }//该函数返回的就是JSON对象,而不是字串

这里要注意的是async=false,如果不设置这个,那么该函数之后的语句会并行执行,下一个语句如果要调用这个JSON,肯定会出错,因为你还没读完呢,就执行到下一句去了。

三、JSON与字符串互换

JSON作为对象与字符串优秀的互异性是其流行的主要原因,很多时候不能传递对象的场合,却可以传递字符串,那么JSON也就可以传递。该函数用到了JQUERY

  1. JSONfunc.JSONtoSTR = function (jsonobj)
  2. {
  3. return JSON.stringify(jsonobj);
  4. }
  5. JSONfunc.STRtoJSON = function (strobj)
  6. {
  7. return JSON.parse(strobj);
  8. }

四、JSON与数据库的交互(Ajax)

将JSON作为字符串直接存入数据库不失为一种存储方案。但是某些排列,筛选的键值还是需要提取出来。由于本次网页只有表单名称和时间戳作为键值,所以数据库就很简单了:

(1)前台命令

前台传递给后台的是一个表单(使用$.ajax函数),或者说,是一群键值对,或者说是结构单一的JSON,下面是一个这类型的JSON的示范以及函数调用:

  1. var _name = "EnvironmentSys";
  2.  
  3. var _jsonobj = strJson;//已经转换好的str格式的json
  4. var _form = { "action": "SaveJsonToDB", "name": _name, "JSONDATA": _jsonobj };
  5. JSONfunc.postJsontoHandler(_form);

下面是所要调用的Ajax函数:

  1. JSONfunc.postJsontoHandler = function (formkk)
  2. {
  3. var ret = "";
  4.  
  5. $.ajax({
  6. type: "post", //要用post方式
  7. url: "/ajax/JsonHandler.aspx?r=" + Math.ceil(Math.random() * 10000),//插入一个随机数
  8. //contentType: "application/json; charset=utf-8",
  9. //dataType: "json",
  10. data: formkk,//表单内容可以随意定制。注意,这里要求的表单是对象,而不是字符串,传递进来的formkk就是一个对象,如果这里输入字符串那么后台不能成功读取
  11. async: false,
  12. success: function (d)
  13. {
  14. ret = d;
  15. },
  16. error: function (err)
  17. {
  18. ret = err.responseText;
  19. }
  20. });
  21. return ret;
  22. }
注意:
  • 可以在web.config里面管理http管道,截获这个网页请求,然后将其导向需要的dll,但是我不想那么麻烦,所以直接将请求指向了一个有后台代码的aspx。当然你可以指向任何阿猫阿狗,这样你就需要写web.config了,还要将相应的函数封装成dll,想想都累。
  • 在请求地址后面加入一个随机数,可以使得浏览器忽略缓存,直接访问该页面本身。浏览器是很懒的,如果它发现它已经请求过这个页面了,它会直接读取缓存中这个页面返回的结果,也就是你以前的请求结果。无论你将目标页面改的面目全非,它都不看一眼。只有让他认为这是个全新页面,它才会认真地发送请求。

(2)后台代码

  1. public partial class ajax_JsonHandler : System.Web.UI.Page {
  2. protected void Page_Load(object sender, EventArgs e) {
  3.  
  4. switch (Request["action"]) {
  5. case ("SaveJsonToDB"): {//将json存入固定的数据库位置,提供用户名和存入时间
  6. SaveJson save = new SaveJson(Request["name"], Request["JSONDATA"]);
  7. string saveDB = save.SaveDB();
  8. Response.Write(saveDB);
  9. Response.End();
  10. break;
  11. }
  12.  
  13. default: { break; }
  14. }
  15. }
  16. }
  17. public class SaveJson {
  18. private string _name;
  19. private string _url;
  20. private string _jsonobj;
  21. public SaveJson(string name, string url, string jsonobj) {
  22. _name = name;
  23. _url = url;
  24. _jsonobj = jsonobj;
  25. }
  26. public SaveJson(string name, string jsonobj) {
  27. _name = name;
  28. _jsonobj = jsonobj;
  29. }
  30. public string SaveDB() {
  31. int rows;
  32. string time = DateTime.Now.ToString();
  33. string source = ConfigurationManager.ConnectionStrings["EPInfoSys"].ConnectionString.ToString();
  34. string DBcommand =
  35. @"INSERT INTO [EPInfoSystem].[dbo].[JsonTable]
  36. ([表名]
  37. ,[时间]
  38. ,[类型]
  39. ,[内容])
  40. VALUES
  41. ('" + _name + "','" + time + "','json','" + _jsonobj + "')";
  42. SqlConnection conn = new SqlConnection(source);
  43. try {
  44. conn.Open();
  45. SqlCommand ads = new SqlCommand(DBcommand, conn);
  46. rows = ads.ExecuteNonQuery();
  47.  
  48. }
  49. catch (Exception ex) {
  50. return (ex.Message);
  51. }
  52. finally {
  53. conn.Close();
  54. }
  55. return "数据库备份录入成功,影响" + rows.ToString();
  56. }
  57.  
  58. }

类操作,很简单,不必多解释了。

先写这些,明天写一点关于C#的文件操作吧。

开发日志系列:一个表单页面的呈现与提交(一)——JSON的操作的更多相关文章

  1. 基于react hooks,zarm组件库配置开发h5表单页面

    最近使用React Hooks结合zarm组件库,基于js对象配置方式开发了大量的h5表单页面.大家都知道h5表单功能无非就是表单数据的收集,验证,提交,回显编辑,通常排列方式也是自上向下一行一列的方 ...

  2. 【HTML5开发系列】表单元素

    <form> 创建一个HTML表单 属性: action 表示提交表单时浏览器应该把用户填写的数据发送到什么地方 method 用来指定表单数据发送到服务器的方式.允许值有get和post ...

  3. C# Winform 通过FlowLayoutPanel及自定义的编辑控件,实现快速构建C/S版的编辑表单页面

    个人理解,开发应用程序的目的,不论是B/S或是C/S结构类型,无非就是实现可供用户进行查.增.改.删,其中查询用到最多,开发设计的场景也最为复杂,包括但不限于:表格记录查询.报表查询.导出文件查询等等 ...

  4. Winform 通过FlowLayoutPanel及自定义的编辑控件,实现快速构建C/S版的编辑表单页面 z

    http://www.cnblogs.com/zuowj/p/4504130.html 不论是B/S或是C/S结构类型,无非就是实现可供用户进行查.增.改.删,其中查询用到最多,开发设计的场景 也最为 ...

  5. JS组件系列——Form表单验证神器: BootstrapValidator

    前言:做Web开发的我们,表单验证是再常见不过的需求了.友好的错误提示能增加用户体验.博主搜索bootstrap表单验证,搜到的结果大部分都是文中的主题:bootstrapvalidator.今天就来 ...

  6. AngularJs 入门系列-2 表单验证

    对于日常的开发来说,最常见的开发场景就是通过表单编辑数据,这里涉及的问题就是验证问题. angularjs 内置已经支持了常见的验证方式,可以轻松实现表单验证. 1. 绑定 为了方便,我们在 $sco ...

  7. Winform开发框架之客户关系管理系统(CRM)的开发总结系列4-Tab控件页面的动态加载

    在前面介绍的几篇关于CRM系统的开发随笔中,里面都整合了多个页面的功能,包括多文档界面,以及客户相关信息的页面展示,这个模块就是利用DevExpress控件的XtraTabPage控件的动态加载实现的 ...

  8. AngularJS系列:表单全解(表单验证,radio必选,三级联动,check绑定,form提交验证)

    一.查看$scope -->寻找Form控制变量的位置 Form控制变量 格式:form的name属性.input的name属性.$... formName.inputField.$pristi ...

  9. SharePoint Designer定制MOSS/WSS表单页面

    转:http://blog.csdn.net/yl_99/article/details/7087897 方法一.使用SharePoint Designer配合enderingTemplate文件来定 ...

随机推荐

  1. java异步任务处理

    1.场景 最近做项目的时候遇到了一个小问题:从前台提交到服务端A,A调用服务端B处理超时,原因是前端一次请求往db插1万数据,插完之后会去清理缓存.发送消息. 服务端的有三个操作 a.插DB b.清理 ...

  2. libpq程序例子

    程序: [root@lex tst]# cat testlibpq.c /* * testlibpq.c * Test the C version of LIBPQ, the POSTGRES fro ...

  3. Custom-Progress-Dialog-Android

    https://github.com/ManolescuSebastian/Custom-Progress-Dialog-Android

  4. android119 侧滑菜单

    MainActivity.java package com.heima52.slidemenu; import com.heima52.slidemenu.view.SlideMenu; import ...

  5. mysql replication inside

    http://keithlan.github.io/2015/07/16/mysql_replication_inside/

  6. error: /usr/include/objc/objc-class.h: No such file or directory

    When i use the example of ShareKit package,i have come across this error:"error: /usr/include/o ...

  7. PHP加速器

    转http://www.vpser.net/opt/apc-eaccelerator-xcache.html 一.PHP加速器介绍         PHP加速器是一个为了提高PHP执行效率,从而缓存起 ...

  8. WebSocket原理及与http1.0/1.1 long poll和 ajax轮询的区别【转自知乎】

    一.WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算)首先HTTP有1.1和1.0之说,也就是所谓的ke ...

  9. [转]oracle odp.net 32位/64位版本的问题

    本文转自:http://www.cnblogs.com/yjmyzz/archive/2011/04/19/2020793.html 如果你的机器上安装了odp.net,且确信machine.conf ...

  10. BeanFactory与FactoryBean

    1. BeanFactory BeanFactory定义了 IOC 容器的最基本形式,并提供了 IOC 容器应遵守的的最基本的接口,也就是Spring IOC 所遵守的最底层和最基本的编程规范.在  ...