js实现字符串转JSON格式
在浏览器前端实现字符串转JSON对象,有多种方法,总结如下:
- 方法1. js函数,eval()
语法:
var obj = eval ("(" + txt + ")"); //必须把文本包围在括号中,这样才能避免语法错误
eval()定义:eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。
由于 JSON 语法是 JavaScript 语法的子集,JavaScript 函数 eval() 可用于将 JSON 文本转换为 JavaScript 对象。
注意:当字符串中包含表达式时,eval() 函数也会编译并执行,转换会存在安全问题。
参考:JSON 使用 | 菜鸟教程,JavaScript eval() 函数
- 方法2. 浏览器自带对象JSON,JSON.parse()
语法:
JSON.parse(text[, reviver])
//text:必需, 一个有效的 JSON 字符串。解析前要确保你的数据是标准的 JSON 格式,否则会解析出错。
//reviver: 可选,一个转换结果的函数, 将为对象的每个成员调用此函数。
JSON.parse()比eval()安全,而且速度更快。支持主流浏览器:Firefox 3.5,IE 8,Chrome,Opera 10,Safari 4。
注意:IE8兼容模式,IE 7,IE 6,会存在兼容性问题。
<!--[if lte IE 7]>
<script src="json2.js"></script>
<![endif]-->
json2.js关键源码分析:
//paring过程分为4个步骤。
//第一个步骤是将unicode字符替换为转义字符。
//js在处理多种字符时是有问题的,不是悄悄的删掉他们,就是把他们当作行结束符。
text = String(text);
cx.lastIndex = 0;
if (cx.test(text)) {
text = text.replace(cx, function (a) {
return '\\u' +
('0000' + a.charCodeAt(0).toString(16)).slice(-4);
});
} //第二个步骤如下:
// In the second stage, we run the text against regular expressions that look
// for non-JSON patterns. We are especially concerned with '()' and 'new'
// because they can cause invocation, and '=' because it can cause mutation.
// But just to be safe, we want to reject all unexpected forms. // We split the second stage into 4 regexp operations in order to work around
// crippling inefficiencies in IE's and Safari's regexp engines. First we
// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
// replace all simple value tokens with ']' characters. Third, we delete all
// open brackets that follow a colon or comma or that begin the text. Finally,
// we look to see that the remaining characters are only whitespace or ']' or
// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. if (/^[\],:{}\s]*$/
.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
.replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { //第三步骤:调用eval命令
//'{'在js中有语法歧义倾向:可以是程序块或者对象字面值。所以这里使用括号来避免歧义
j = eval('(' + text + ')');
json2.js关键源码
参考:JSON.parse() | 菜鸟教程,json2.js 简析(个人学习) - 奋斗小小鸟的专栏
- 方法3. 引用jQuery插件,$.parseJSON()
语法:
$.parseJSON(json) //json:String类型,传入格式有误的JSON字符串可能导致抛出异常
$.parseJSON()关键源码分析:
// 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 ) )();
}
$.parseJSON()关键源码
参考:jQuery.parseJSON()方法 | 菜鸟教程,jQuery静态方法parseJSON方法使用和源码分析 - -洋仔
- 方法4. AJAX请求获取JSON数据时,$.getJSON()
语法:
jQuery.getJSON(url,data,success(data,status,xhr))
//url 必需。规定将请求发送的哪个 URL。
//data 可选。规定连同请求发送到服务器的数据。
//success(data,status,xhr) 可选。规定当请求成功时运行的函数。
这个时候返回的data已经是JSON对象,不需要再进行转换。
$.getJSON() 是简写的 Ajax 函数,等价于:
$.ajax({
url: url,
data: data,
success: callback,
dataType: "json"
});
总结:
1.建议使用JSON.parse()方法;如果需兼容IE6/7,再引入json2.js文件(下载)。 相对应的JSON.stringify()方法,可用来将JSON对象转换为字符串。
2.如果页面里已经引用jQuery,你又不想再引入多余文件(json2.js),也可以使用$.parseJSON()方法。
3.使用eval()时,必须保证字符串里没有可执行代码。
4.如果是通过AJAX获取JSON数据,直接用$.getJSON()函数,或者在$.ajax()中加入参数dataType: "json",就可以直接得到JSON对象。
参考:JS字符串转换为JSON的四种方法笔记 - 天使不哭 - 博客园
js实现字符串转JSON格式的更多相关文章
- js判断字符串是否json格式
function isJSON(str) { if (typeof str == 'string') { try { var obj=JSON.parse(str); if(typeof obj == ...
- JavaScript中,JSON格式的字符串与JSON格式的对象相互转化
前言:JSON是一个独立于任何语言的数据格式,因此,严格来说,没有“JSON对象”和“JSON字符串”这个说法(然而”菜鸟教程“和”W3school“使用了“JSON对象”和“JSON字符串”这个说法 ...
- JS之字符串与JSON转换
JS之字符串转换JSON 1.eval 古老的方式 function strToJson(str){ var json = eval('(' + str + ')'); return json; ...
- JS实现的一个query字符串转Json格式数据的方法
输入字符串的格式是 a=1&b=2&c=3 $.par2Json = function (string, overwrite) { var obj = {}, pairs = stri ...
- js字符串转json格式与json对象转字符串
json字符串----->json对象json对象------>json字符串 使用JSON.parse()函数 this.dataList = JSON.parse(dataList); ...
- 如何识别一个字符串是否Json格式
前言: 距离上一篇文章,又过去一个多月了,近些时间,工作依旧很忙碌,除了管理方面的事,代码方面主要折腾三个事: 1:开发框架(一整套基于配置型的开发体系框架) 2:CYQ.Data 数据层框架(持续的 ...
- js将字符串转json
Json格式字符串 "{"rows":[{"date":"2018-11-19","money":" ...
- List转换成json格式字符串,json格式字符串转换成list
一.List转换成json字符串 这个比较简单,导入gson-x.x.jar, List<User> users = new ArrayList<User>(); Gson g ...
- .net 字符串和JSON格式的互换
近期又做了个问卷调查,问卷调查一次性要保存一二十个题目和答案!所以嘞,博主为了偷懒,就直接把答卷内容保存成了Json格式! 好处当然是很多啦! 只需一个字段就能保存整个答卷的内容! 想想都刺激!哈哈~ ...
随机推荐
- 关于linux网卡消失的问题
首先我也是一名学生,在学习的过程Linux的过程中,因为老师要求配置hadoop集群所以就匆匆忙忙的上手了,但是在配置网络的问题时遇到了网卡消失的问题 我在网上询问了许多的人,但是还是没有找到一个很好 ...
- Rails.cache相关知识
可能里面的一些知识已经不被大家使用了,但是作为学习,我想和大家分享一下个人关于Rails.cache的浅显的认识,望大家指教. 1.Rails.cache是什么 它是Rails中的缓存,拥有所有缓存的 ...
- 基于Common.Logging + Log4Net实现的日志管理
前言 Common.Logging 是Commons-Logging(apache最早提供的日志门面接口,提供了简单的日志实现以及日志解耦功能) 项目的.net版本.其目的是为 "所有的.n ...
- BootStrap4.0Demo+轮播素材记录
整理一些关于前端的东西: BootStrap4.0Demo: 官方DEMO:http://code.z01.com/v4/components/carousel.html 下午翻了点不错的轮播素材: ...
- APPCAN 通信(appcan.ajax)
引用JS: function callWebService(serviceName, params, methodType, offline, callBack, callBackError){ // ...
- black box黑盒测试
软件规格说明书 等价类划分,完备性,无冗余性(不能有交集). 健壮等价类:无效等价类 边界值分析,对于一个含有n个变量的程序,采用边界值分析法测试程序会产生4n+1个测试用例 ...
- Java并发框架:Executor
介绍 随着当今处理器中可用的核心数量的增加, 随着对实现更高吞吐量的需求的不断增长,多线程 API 变得非常流行. Java 提供了自己的多线程框架,称为 Executor 框架. 1. Execut ...
- POJ 3183:Stump Removal(模拟)
http://poj.org/problem?id=3183 题意:有n个树桩,分别有一个高度h[i],要用Bomb把树桩都炸掉,如果炸的位置的两边树桩高度小于Bomb炸的树桩高度,那么小于树桩高度的 ...
- 为什么我使用 Linux 开发
Linux 能用吗? 当我对 Linux 的印象似乎还停留在黑乎乎的命令行界面上的时候,我身边的一些朋友告诉我或者建议我使用 Linux 时,我会一脸惊讶的问他,那个怎么用(来开发或者日常使用)? L ...
- django基础知识之模板继承:
模板继承 模板继承可以减少页面内容的重复定义,实现页面内容的重用 典型应用:网站的头部.尾部是一样的,这些内容可以定义在父模板中,子模板不需要重复定义 block标签:在父模板中预留区域,在子模板中填 ...