JSON.parse()和JSON.stringify()

一、JSON的解析方法有两种:eval()和JSON.parse()

var jsonstr='{"str1":"Hello,", "str2":"world!"}';
var evalJson=eval('('+jsonstr+')');
var jsonParseJson=JSON.parse(jsonstr);

 这样就把jsonstr这个json格式的字符串转换成了JSON对象。

二者的区别在于:JSON.parse()可以解析json格式的数据,并且会对要解析的字符串进行格式检查,如果格式不正确则不进行解析,而eval()可以解析任何字符串,eval()会执行字符串的代码,造成原先字符串的值改变,是不安全的。

二、JSON.parse(text [, reviver])语法

1、参数

text:必选。一个有效的 JSON 字符串。

reviver:可选。一个转换结果的函数,将为对象的每个成员调用此函数。

2、功能

JSON.parse(jsonstr)将格式完好的json字符串转换为json对象。所谓"格式完好",就是要求jsonstr必须符合严格的JSON格式,例如:属性名称必须用双引号,字符串值也必须用双引号括起来,单引号写在{}外。

3、实例

var jsonstr='{"str1":"abc", "str2":"123"}';
var jsonobj=JSON.parse(jsonstr);
console.log(jsonobj);
运行结果如下:
Object
str1: "abc"
str2: "123"
__proto__: Object

三、JSON.stringify(value [, replacer] [, space])语法 

1、参数

value:必选。通常为输入的对象,比如数组,类等。

replacer:可选。通常有两种方式,数组和方法。

(1) replacer为数组时,它和第一个参数有关。一般来说,系列化后的结果是通过键值对来表示。如果第二个参数的值在第一个参数中存在,那么就以第二个参数的值为key,第一个参数的值为value;如果不存在,那么第二个参数会被忽略,只是第一个参数被系列化。

(2) replacer为方法时,把系列化后的每一个对象传进方法里进行处理。

space:可选。添加缩进、空白和换行符,使JSON文本更便于阅读。

2、功能

JSON.stringify(jsonobj)将json对象转换为json字符串

3、实例

(1)JSON.stringify()只有第一个参数时

var stuArrobj=[
  {name: "张三", sex:1, age: 25},
  {name: "李四", sex:0, age: 20},
  {name: "王五", sex:1, age: 25}
];
var stuArrstr=JSON.stringify(stuArrobj);
console.log(stuArrstr);
运行结果如下:
[{"name":"张三","sex":1,"age":25},{"name":"李四","sex":0,"age":20},{"name":"王五","sex":1,"age":25}]

(2)JSON.stringify()第二个参数存在,并且为方法时

如果数据比较复杂,除了姓名,性别,年龄,还有头像,昵称,签名等信息,但只需要把用户名和性别保存在本地,有两种实现方式。

A遍历数据,重新提取

var stuArrobj=[
  {name: "张三", sex:1, age: 25},
  {name: "李四", sex:0, age: 20},
  {name: "王五", sex:1, age: 25}
];
for (var i=0, newArr=[]; i<stuArrobj.length; i++) {
  newArr.push({
    name: stuArrobj[i].name,
    sex: stuArrobj[i].sex
  });
}
var stuArrstr=JSON.stringify(newArr);
console.log(stuArrstr);
运行结果如下:
[{"name":"张三","sex":1},{"name":"李四","sex":0},{"name":"王五","sex":1}]

B用JSON.stringify()的第二个参数

var stuArrobj=[
  {name: "张三", sex:1, age: 25},
  {name: "李四", sex:0, age: 20},
  {name: "王五", sex:1, age: 25}
];
var stuArrstr=JSON.stringify(stuArrobj, ["name", "sex"]);
console.log(stuArrstr);
运行结果如下:
[{"name":"张三","sex":1},{"name":"李四","sex":0},{"name":"王五","sex":1}]

如果要把1,0修改为男女,那么第二个参数可以用回调函数来处理。

var stuArrobj=[
  {name: "张三", sex:1, age: 25},
  {name: "李四", sex:0, age: 20},
  {name: "王五", sex:1, age: 25}
];
var stuArrstr=JSON.stringify(stuArrobj, function (k, v) {
  if (k === "sex") {
    return ["女", "男"][v];
  }
  return v;
});
console.log(stuArrstr);
运行结果如下:
[{"name":"张三","sex":"男","age":25},{"name":"李四","sex":"女","age":20},{"name":"王五","sex":"男","age":25}]

(3)JSON.stringify()第二个参数存在,并且为数组时

A第一个参数和第二个参数都是数组

var stuArr1=new Array(); 
stuArr1[0]="张三"; 
stuArr1[1]="李四"; 
stuArr1[2]="王五"; 
var stuArr2=new Array(); 
stuArr2[0]="1"; 
stuArr2[1]="2"; 
var stuArrstr=JSON.stringify(stuArr1,stuArr2);
console.log(stuArrstr); //第二个参数被忽略,只是第一个参数被系列化
运行结果如下:
["张三","李四","王五"]

B第一个参数是对象,第二个参数是数组

var stuobj=new Object(); 
stuobj.name="张三"; 
stuobj.age="25"; 
var stuArr=new Array(); 
stuArr[0]="id"; //stuobj对象里不存在,忽略。 
stuArr[1]="name"; 
var stuArrstr=JSON.stringify(stuobj,stuArr); 
console.log(stuArrstr);
运行结果如下:
{"name":"张三"}

(4)JSON.stringify()第三个参数的使用

A如果省略第三个参数,那么显示出来的值没有分隔符。

var stuobj=new Object(); 
stuobj.name="张三"; 
stuobj.age="25"; 
var stuArrstr=JSON.stringify(stuobj); 
console.log(stuArrstr);
运行结果如下:
{"name":"张三","age":"25"}

B如果第三个参数是数字,则缩进几个字符。如果大于10,则默认为10,因为最大值为10。

var stuobj=new Object(); 
stuobj.name="张三"; 
stuobj.age="25"; 
var stuArrstr=JSON.stringify(stuobj,null,1000); 
console.log(stuArrstr);
运行结果如下:
{
          "name": "张三",
          "age": "25"
}

C如果第三个参数是转义字符,比如“\t”,表示回车,那么它每行一个回车。

var stuobj=new Object(); 
stuobj.name="张三"; 
stuobj.age="25"; 
var stuArrstr=JSON.stringify(stuobj,null,'\t'); 
console.log(stuArrstr);
运行结果如下:
{
    "name": "张三",
    "age": "25"
}

D如果第三个参数是字符串,就在每行输出值的时候把该字符串附加上去,最大长度也是10个字符。 

var stuobj=new Object(); 
stuobj.name="张三"; 
stuobj.age="25"; 
var stuArrstr=JSON.stringify(stuobj,null,'student'); 
console.log(stuArrstr);
运行结果如下:
{
student"name": "张三",
student"age": "25"
}

4、限制

IE6,7,8不能使用JSON.stringify(),可以用json2.js将json对象转换为json字符串。

<!--[if lt IE 9]>
    <script src="json2.js"></script>
<![endif]-->

四、综合应用

var arr=["a", "b", "c"];
var str=JSON.stringify(arr);    //将数组转换为字符串
var newArr=JSON.parse(str);  //将字符串转换为数组

输出“键-值”字符串

var resultObj =[
  {
    qid:0,//表示题目编号,取值0-5
    aid:1 //表示答案选项编号,有ABCD,对应0123
  },
  {
    qid:1,
    aid:2
  },
  {
    qid:2,
    aid:0
  },
  {
    qid:3,
    aid:3
  },
  {
    qid:4,
    aid:1
  },
  {
    qid:5,
    aid:0
  }
]
var str = JSON.stringify(resultObj);
console.log(str);
//[{"qid":0,"aid":1},{"qid":1,"aid":2},{"qid":2,"aid":0},{"qid":3,"aid":3},{"qid":4,"aid":1},{"qid":5,"aid":0}]

输出“值-值”字符串

var resultObj = {};
var arr = [1,2,0,3,1,0];
for(var i=0; i<arr.length; i++){
  resultObj[i] = arr[i];
}
var str = JSON.stringify(resultObj);
console.log(str);
//{"0":1,"1":2,"2":0,"3":3,"4":1,"5":0}

五、从console面板看数组字符串的区别

var arr=["a", "b", "c"];
var str=JSON.stringify(arr);    
console.log(arr); 
alert('arr是一个数组,打印出来是:'+arr); 

arrstr2

 

var arr=["a", "b", "c"];
var str=JSON.stringify(arr);    
console.log(str);  
alert('数组变成数组字符串:'+str);

arrstr1

转载于:https://www.cnblogs.com/camille666/p/object_transfer_string.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值