Comments (9)
JSON.parse() 方法解析一个JSON字符串,可将JSON字符串转化为对象。
JSON.parse(text [, reviver])
//第一个参数必填,一个有效的JSON字符串 第二个参数选题 是一个函数, 它用来转换已经被从text字符串转为对象的对象。对应的规则格式如下:
(1)如果reviver返回的是一个有效值,则对应的属性值将替换为转换后的值。
(2)如果reviver返回的值与它接收的相同值,则不修改对应属性值。
(3)如果reviver返回的是undefined,则删除对应的属性。
a、省略第二个参数:
var jsonStr='{"name":"age","url":"www.com","sex":"男"}';
var obj=JSON.parse(jsonStr);
b、返回修改后的值
function reviver(key,value){
if(key=="name"){
return "one";
}
return value;
}
var jsonStr='{"name":"age","url":"www.com","sex":"男"}';
var obj=JSON.parse(jsonStr,reviver);
c、返回undefined,删除对应的属性
function reviver(key,value){
if(key=="webName"){
return "antzone";
}else if(key=="age"){
return undefined;
}
return value;
}
var jsonStr='{"name":"age","url":"www.com","sex":"男"}';
var obj=JSON.parse(jsonStr,reviver);
from step-by-step.
感觉实现的不太完善,先工作,下午再完善一下
var A = "{ a: 1 , b : 'hello' }";
var B = "{ 'a': 1 , 'b' : 'hello' }";
var C = "{'a':1,'b':'hello'}";
var D = '{"a":1,"b":"hello"}';
var E = '{ "a" : 1 , "b" : "hello" }';
var E = '{ "a" : 1 , "b" : "sadfsf" }';
var F = '{ "a" : 1 ,\n "b" : "hello" }';
var G = '{ "a" : 1 , "b" : window.location.href="https://www.baidu.com" }';
//JSON.parse() A,B,C,G都不可转, D,E,F可以转换
//eval() 都可以转, G还执行了G.b的代码
function jsonParse(str) {
if(!str || str.constructor !== String || str.indexOf(':') === -1){
return {};
}else{
let tempStr = str.replace(/'|"| |{|}/ig, '');
let tempArr = tempStr.split(',');
let returnObj = {};
tempArr.map( item => {
returnObj[item.slice(0, item.indexOf(':'))] = item.slice(item.indexOf(':') + 1, item.length);
});
console.log(returnObj);
}
}
jsonParse(A);
from step-by-step.
var A = "{ a: 1 , b : 'hello' }";
var B = (new Function('return'+ A))()
B 结果为 :{a: 1, b: "hello"}
from step-by-step.
eval
from step-by-step.
// 只能处理格式正确且不含空格的json
function jsonParse(json) {
i = 0;
str = json;
return parseValue();
}
function parseValue() {
if(str[i]==='n') {
return parseNull();
} else if(str[i]==='t') {
return parseTrue();
} else if(str[i]==='f') {
return parseFalse();
} else if(str[i]==='"') {
return parseString();
} else if(str[i]==='[') {
return parseArray();
} else if(str[i]==='{') {
return parseObject();
} else {
return parseNumber();
}
}
function parseSpace() {
while(str[i]==' ') {
i++;
}
}
function parseNull() {
let content = str.substring(i, i+4);
// let content = str.substr(i, 4);
if(content==='null') {
i+=4;
return null;
} else {
throw new Error('Unexpected char at pos: ' + i);
}
}
function parseTrue() {
let content = str.substring(i, i+4);
// let content = str.substr(i, 4);
if(content==='true') {
i+=4;
return true;
} else {
throw new Error('Unexpected char at pos: ' + i);
}
}
function parseFalse() {
let content = str.substring(i, i+5);
// let content = str.substr(i, 5);
if(content==='false') {
i+=5;
return false;
} else {
throw new Error('Unexpected char at pos: ' + i);
}
}
function parseString() {
i++;
let result = '';
while(str[i]!=='"') {
result += str[i++];
}
i++;
return result;
}
function parseArray() {
i++;
let result = [];
while(str[i]!==']') {
result.push(parseValue());
if(str[i] ===',') {
i++;
}
}
i++;
return result;
}
function parseObject() {
i++;
let result = {};
while(str[i]!=='}') {
let key = parseString();
i++; // 略过一个冒号(:)
let value = parseValue();
result[key] = value;
if(str[i]===',') i++;
}
i++;
return result;
}
function parseNumber() {
let result = '';
while(isNumberChar(str[i])) {
result += str[i++];
}
return parseFloat(result);
}
function isNumberChar(c) {
let chars = {
'+': true,
'-': true,
'e': true,
'E': true,
'.': true
}
if(chars[c]) {
return true;
}
if(c>='0'&&c<='9') {
return true;
} else {
return false;
}
}
const test = '{"a":1,"b":true,"c":false,"foo":null,"bar":[1,2,3]}';
console.log(jsonParse(test));
from step-by-step.
第一种方式 eval
最简单,最直观的方式就是调用 eval
var json = '{"name":"小姐姐", "age":20}';
var obj = eval("(" + json + ")"); // obj 就是 json 反序列化之后得到的对象
直接调用 eval
存在 XSS
漏洞,数据中可能不是 json
数据,而是可执行的 JavaScript
代码。因此,在调用 eval
之前,需要对数据进行校验。
var rx_one = /^[\],:{}\s]*$/;
var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
var rx_four = /(?:^|:|,)(?:\s*\[)+/g;
if (
rx_one.test(
json
.replace(rx_two, "@")
.replace(rx_three, "]")
.replace(rx_four, "")
)
) {
var obj = eval("(" +json + ")");
}
JSON
是 JS 的子集,可以直接交给 eval
运行。
第二种方式 new Function
Function
与 eval
有相同的字符串参数特性。
var json = '{"name":"小姐姐", "age":20}';
var obj = (new Function('return ' + json))();
from step-by-step.
- 利用function
var jsonStr = '{"age":20,"name":"jack"}'
var json = (new Function('return '+jsonStr))()
console.log(typeof json)
2.利用eval
var rx_one = /^[\],:{}\s]*$/;
var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
var rx_four = /(?:^|:|,)(?:\s*\[)+/g;
if (
rx_one.test(
json
.replace(rx_two, "@")
.replace(rx_three, "]")
.replace(rx_four, "")
)
) {
var obj = eval("(" +json + ")");
}
from step-by-step.
// eval 是最简单的方法,可是不太懂为什么eval中要加个“(”、“)”
var json = '{"name":"小姐姐", "age":20}';
var obj = eval("(" + json + ")");
from step-by-step.
实现一个json.parse()
方式一
eval()
看见楼上的小姐姐提了一个eval("("+params+")"),为什么要用“()”去包裹参数,这个问题,我最初面向google搜索引擎 去研究了下 发现google不如国产百度好用,于是我面向国产百度搜索引擎去研究了下,得到的结论是,eval 接收可执行的js脚本或代码块,但不接受不可运行的js脚本作为参数"()"是让eval 把参数作为表达式去解析.
例如:
var json = '{"name":"蔡徐坤","age":"99“}'
console.log(eval("("+ json +")")) // {"name":"蔡徐坤","age":"99“}
方式二
函数
var jsond = '{"name":"蔡徐坤","age":"99"}'
var result = (new Function('return'+ jsond))()
console.log(result) //
from step-by-step.
Related Issues (20)
- 寄生组合式继承的基本**是什么?有哪些优缺点? HOT 12
- 实现一个 JSON.stringify HOT 9
- 实现一个观察者模式 HOT 10
- 使用CSS让一个元素水平垂直居中 HOT 11
- ES6模块和CommonJS模块有哪些差异? HOT 8
- 如何使用Proxy实现简单MVVM HOT 2
- 以下代码的输出的结果为: HOT 7
- 列举常见的JS和CSS兼容性问题
- 介绍下 Set、Map、WeakSet 和 WeakMap 的区别? HOT 1
- Vue组件间是怎么进行参数传递的? HOT 4
- 如果浏览器主线程一直被占据,那么setTimeout会什么时候执行
- rem、em、vh、vw 有什么区别
- flex-grow 与 flex-shrink 的计算规则
- while循环卡死和微任务卡死有什么区别
- sourcemap原理是什么
- 闭包会导致内存泄漏为什么还要使用?
- 前端怎么显示1G的图片甚至1T的图片
- 手写lodash的get方法
- setTimeout回调和fetch回调哪个先执行
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from step-by-step.