弘帝企业智能建站系统交流平台

 找回密码
 立即注册
查看: 3359|回复: 3

【js】js操作cookie,将字符串数据解析为json格式

[复制链接]
发表于 2016-9-16 12:49:59 | 显示全部楼层 |阅读模式
function trim(str){                //删除左右两端的空格                        
        return str.replace(/(^\s*)|(\s*$)/g, "");
}
        
function setCookie(sName, sValue, days) { //写cookies函数
        var expires = new Date();
        expires.setTime(expires.getTime() + parseInt(days) * 24 * 60 * 60 * 1000);
        document.cookie = sName + "=" + escape(sValue) + ";expires=" + expires.toGMTString()+";path=/;domain=xxx.cn";
};

function getCookie(name){ //取cookies函数         
        var arr = document.cookie.match(new RegExp("(^| )"+name+"=([^;]*)(;|$)"));
        if(arr != null) return unescape(arr[2]); return null;
}
         
function parseJSON(data){
        if ( typeof data !== "string" || !data ) {
                return null;
        }
        // Make sure leading/trailing whitespace is removed (IE can't handle it)
        data = jQuery.trim(data);
        // Attempt to parse using the native JSON parser first
        if ( window.JSON && window.JSON.parse ) {
                return window.JSON.parse(data);
        }
        // Make sure the incoming data is actual JSON
        // Logic borrowed from http://json.org/json2.js
        if ( rvalidchars.test( data.replace( rvalidescape, "@" )
                .replace( rvalidtokens, "]" )
                .replace( rvalidbraces, "")) ) {
                return ( new Function( "return " + data ) )();
        }
        OpPopAlert( "Invalid JSON: " + data );
        return;
}        


将javascript 中字符串数据转换为 json 对象有三种方法:
1. eval() 函数
2. 使用 new Function() 构造函数
3. 使用浏览器内置的JSON.parse 方法(IE Version > IE8(s))

三种使用方法:
var json = '{"name":"liangqi"; "sex":"boy"}';
jsonObj0 = eval('(' + json + ')');
jsonObj1 = (new Function('return' + json))();
if(window.JSON){
jsonObj2 = JSON.parse(json);
} else {
... ... //针对比支持此方法的调用此处
}

下面来说说使用这三种方法的建议:

eval() 函数,很强大的函数,会模拟一个js 解析器,能解析任何js 代码,但是执行效率和安全性不是很高好,所能在做demo时候可以使用,但是在做项目是不推荐使用。

Function 构造函数方法,这是Jquery 中解析JSON数据的方法,查看他的源代码中即可看到,使用此方法,经人测试,比eval() 快很多倍
/**
*jQuery源码分析,557-580行
*creator liangqi
*Date 2011-12-3
*Email liangqi000#gmail.com
*/
... ...
parseJSON: function(data ){
if(typeof(data) !== 'string' || !data ){
return null;
}

if(window.JSON && window.JSON.parse){
return window.JSON.parse(data);
}
if ( rvalidchars.test( data.replace( rvalidescape, "@" )
.replace( rvalidtokens, "]" )
.replace( rvalidbraces, "")) ) {

     return (new Function( "return " + data ))();
   
  }
jQuery.error( "Invalid JSON: " + data );
}


回复

使用道具 举报

 楼主| 发表于 2016-9-22 20:03:35 | 显示全部楼层
实例 :1yyg模板
需引用jquery.cookie.js或jquery.cookie函数

shop.js中
//json 格式:[{'ProductID':ABC','Num':'1'},{'ProductID':DEF,'Num':'2'}]
//这里使用到了 $.cookie这个插件。这个插件的代码在文章的最后
//添加商品及数量到购物车cookie中,返回当前商品在cookie中的总数
var pn;//ProductNumber 产品项数量
var totalNum;//产品总量
var cookieSet = { expires: 7, path: '/' }; //设置cookie路径的
function AddToCart(id,yunid,title,img,price,num){
  var _num = 1;
  if (num != undefined)
          _num = num;
  totalNum = _num; //总数默认为传入参数
//  $.cookie("Product", null, cookieSet);//清除Cookie
  var jsonStr = "[{'ProductID':'" + id + "','YunID':'" + yunid + "','Title':'" + title + "','Photo':'" + img + "','Price':'" + price + "','Num':'" + _num + "'}]"; //构造json字符串,id是商品id  num是这个商品的数量
  if ($.cookie("Product") == null) {
    $.cookie("Product", jsonStr, cookieSet); //如果没有这个cookie就设置他
  }
  else{
    var jsonObj = eval('(' + $.cookie("Product") + ')'); //如果有,把json字符串转换成对象
    var findProduct = false;//是否找到产品ID,找到则为TRUE,否则为FALSH
    for (var obj in jsonObj) {
      if(jsonObj[obj].ProductID == id) {
        jsonObj[obj].Num = Number(jsonObj[obj].Num) + Number(_num);
        jsonObj[obj].YunID = yunid;
        jsonObj[obj].Title = title;
        jsonObj[obj].Photo = img;
        jsonObj[obj].Price = price;
        totalNum = jsonObj[obj].Num;
        findProduct = true;
        break;
      }
    }
    if(findProduct == false){ //没找到,则添加
      jsonObj[jsonObj.length] = new Object();
      jsonObj[jsonObj.length - 1].ProductID = id;
      jsonObj[jsonObj.length - 1].YunID = yunid;
      jsonObj[jsonObj.length - 1].Title = title;
      jsonObj[jsonObj.length - 1].Photo = img;
      jsonObj[jsonObj.length - 1].Price = price;
      jsonObj[jsonObj.length - 1].Num = _num;
    }
    $.cookie("Product", JSON.stringify(jsonObj), cookieSet); //写入coockie  JSON需要json2.js支持
  }
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-22 20:05:38 | 显示全部楼层
利用json.stringify修改Cookie中某一个值,需要调用jquery.cookie函数或js文件
实例:1yyg模板

var cookieSet = { expires: 7, path: '/' }; //设置cookie路径的
var jsonObj = eval('(' + $.cookie("Product") + ')'); //如果有,把json字符串转换成对象
//修改jsonObj中的某一个值,其它值保持不变
for (var obj in jsonObj) {
          if(jsonObj[obj].ProductID == $(this).closest(".rows").find("input[name=pid]").val()) {
                jsonObj[obj].Num = $(".num").val();
                break;
          }
}
//对修改后的json转换成字符串并保存入cookie
$.cookie("Product", JSON.stringify(jsonObj), cookieSet);
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-23 22:52:47 | 显示全部楼层
利用json.stringify删除cookie中的某一值,利用数组中的splice函数
实例:1yyg模板

  if(this.className=='remove'){
        var jsonObj = eval('(' + $.cookie("Product") + ')'); //如果有,把json字符串转换成对象
        for (var obj in jsonObj) {
          if(jsonObj[obj].ProductID == Number($(this).closest(".rows").find("input[name=pid]").val())) {
                //jsonObj.splice(obj);///移除当前obj后所有的数组,
                jsonOjbj.splice(obj,1);///只移除当前obj,后面的数组保持不变
                break;
          }
        }
        $.cookie("Product", JSON.stringify(jsonObj), cookieSet);
  }



var arr = [2,4,6,8];
//刪除2的話,先找出index在哪
var index = arr.indexOf( 2 ); //0
arr.splice(index, 1);
console.log(arr); //[4,6,8]
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|弘帝企业智能建站系统 ( 皖ICP备07503252号 )

GMT+8, 2024-4-20 19:49 , Processed in 0.065364 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表