Safely turning a JSON string into an object
给定一个JSON数据字符串,如何安全地将该字符串转换为一个JavaScript对象?
很明显,你可以用像…
1 | var obj = eval("(" + json + ')'); |
…但这会使我们容易受到包含其他代码的JSON字符串的攻击,这对于简单地评估似乎非常危险。
只要你能保证一个相当现代化的浏览器,
jquery方法现在已弃用。改为使用此方法:
1 | let jsonObject = JSON.parse(jsonString); |
使用已弃用的jquery功能的原始答案:
如果使用jquery,只需使用:
1 | jQuery.parseJSON( jsonString ); |
这正是您要查找的内容(请参见jquery文档)。
编辑:这个答案适用于IE<7,对于现代浏览器,请查看上面的乔纳森的答案。
编辑:这个答案过时了,乔纳森的回答(
org有多种语言的JSON解析器,包括4种不同的JavaScript解析器。我相信大多数人都会考虑json2.js的goto实现。
使用msdn上以下链接中表示的简单代码。
1 2 | var jsontext = '{"firstname":"Jesper","surname":"Aaberg","phone":["555-0100","555-0120"]}'; var contact = JSON.parse(jsontext); |
反向
1 | var str = JSON.stringify(arr); |
我不确定其他的方法,但这里是如何在原型(JSON教程)中实现的。
1 2 3 4 5 6 7 | new Ajax.Request('/some_url', { method:'get', requestHeaders: {Accept: 'application/json'}, onSuccess: function(transport){ var json = transport.responseText.evalJSON(true); } }); |
使用true调用evaljson()作为参数来清理传入字符串。
这似乎就是问题所在:
通过Ajax WebSocket等接收到一个输入,它始终是字符串格式的——但您需要知道它是否是json.parsable。问题是,如果您总是通过json.parse运行它,那么程序可能会"成功"地继续运行,但您仍然会看到控制台中抛出了一个错误,并带有可怕的"错误:意外的标记"x"。
1 2 3 4 5 6 7 8 9 | var data; try { data = JSON.parse(jqxhr.responseText); } catch (_error) {} data || (data = { message: 'Server error, please retry' }); |
如果您使用的是jquery,您也可以使用
然后你可以做像
1 2 3 4 5 6 | $.ajax({ url: url, dataType: 'json', data: data, success: callback }); |
回调将传递返回的数据,该数据将是JSON结构定义的javascript对象或数组,并使用
尝试使用此数据对象的方法。例:
1 2 3 4 5 6 7 | try { eval('var obj=' + Data); console.log(obj.count); } catch(e) { console.log(e.message); } |
当您使用串行端口编程时,此方法确实有助于nodejs。
为了好玩,以下是使用功能的方法:
1 | jsonObject = (new Function('return ' + jsonFormatData))() |
使用
1 2 | var response = '{"result":true,"count":1}'; var JsonObject= JSON.parse(response); |
然后可以得到
1 2 | var myResponseResult = JsonObject.result; var myResponseCount = JsonObject.count; |
使用文档中描述的jquery:
1 | JSON.parse(jsonString); |
使用json.parse可能是最好的方法。以下是一个现场演示示例
1 2 3 4 5 | var jsonRes = '{"students" : [' + '{"firstName":"Michel" ,"lastName":"John" ,"age":18},' + '{"firstName":"Richard" ,"lastName":"Joe","age":20 },' + '{"firstName":"James" ,"lastName":"Henry","age":15 } ]}'; var studentObject = JSON.parse(jsonRes); |
我找到了一个更好的方法:
在咖啡中描述:
1 2 | try data = JSON.parse(jqxhr.responseText) data ||= { message: 'Server error, please retry' } |
在JavaScript中:
1 2 3 4 5 6 7 8 9 | var data; try { data = JSON.parse(jqxhr.responseText); } catch (_error) {} data || (data = { message: 'Server error, please retry' }); |
1 | JSON.parse(jsonString); |
json.parse将变为对象。
JSON解析总是让人头疼。如果输入不符合预期,它就会抛出一个错误,并破坏您正在做的工作。您可以使用下面的小函数来安全地分析您的输入。即使输入无效或已经是大多数情况下更好的对象,它也始终会转换对象。
1 2 3 4 5 6 7 8 9 10 11 12 13 | JSON.safeParse = function (input, def) { // Convert null to empty object if (!input) { return def || {}; } else if (Object.prototype.toString.call(input) === '[object Object]') { return input; } try { return JSON.parse(input); } catch (e) { return def || {}; } }; |
将对象转换为JSON,然后对其进行解析,对我来说是可行的,比如:
1 | JSON.parse(JSON.stringify(object)) |
如果我们有这样的字符串:""状态":1,"token":"65B4352B2DF4957A09AD0CE5714059
正式记录:
句法
1 | JSON.parse(text[, reviver]) |
参数
文本
要解析为JSON的字符串。有关JSON语法的描述,请参见JSON对象。
复活器(可选)
如果是一个函数,这就规定了在返回之前如何转换解析产生的值。
返回值
与给定的JSON文本对应的对象。
例外情况
如果要分析的字符串不是有效的JSON,则引发SyntaxError异常。
parse()将传递给函数的任何JSON字符串转换为JSON对象。
要更好地理解,请按F12打开浏览器的inspect元素,然后转到console编写以下命令:
1 2 | var response = '{"result":true,"count":1}'; //sample json object(string form) JSON.parse(response); //converts passed string to JSON Object. |
现在运行命令:
1 | console.log(JSON.parse(response)); |
您将得到输出作为对象结果:真,计数:1。
为了使用该对象,可以将其分配给变量,例如obj:
1 | var obj = JSON.parse(response); |
现在,通过使用obj和dot(.)操作符,可以访问JSON对象的属性。
尝试运行命令
1 | console.log(obj.result); |
您还可以使用
1 2 3 | var data = JSON.parse(jsonString, function reviver(key, value) { //your code here to filter }); |
有关更多信息,请阅读json.parse
我知道,以前的问题,但是没有人注意到使用
举个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | var oData = 'test1:"This is my object",test2:"This is my object"'; if( typeof oData !== 'object' ) try { oData = (new Function('return {'+oData+'};'))(); } catch(e) { oData=false; } if( typeof oData !== 'object' ) { alert( 'Error in code' ); } else { alert( oData.test1 ); alert( oData.test2 ); } |
这有点安全,因为它在函数内部执行,而不是直接在代码中编译。因此,如果其中有一个函数声明,它将不会绑定到默认窗口对象。
我使用它来"编译"简单而快速的DOM元素(例如数据属性)的配置设置。
用json.parse()解析json字符串,数据变成一个javascript对象。
1 | JSON.parse(jsonString) |
这里,JSON表示处理JSON数据集。
例子,假设我们从一个Web服务器接收到了此文本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | '{"name":"John","age":30,"city":"New York <hr> Summary: <p> Javascript (both browser and NodeJS) have a built in <wyn>JSON</wyn> object. On this Object are 2 convenient methods for dealing with <wyn>JSON</wyn>. They are the following: </p> <li> <wyn>JSON.parse()</wyn> Takes <wyn>JSON</wyn> as argument, returns JS object </li> <li> <wyn>JSON.stringify()</wyn> Takes JS object as argument returns <wyn>JSON</wyn> object </li> Other applications: <p> Besides for very conveniently dealing with <wyn>JSON</wyn> they have can be used for other means. The combination of both <wyn>JSON</wyn> methods allows us to make very easy make deep clones of arrays or objects. For example: </p> <p> [cc lang="javascript"]let arr1 = [1, 2, [3 ,4]]; let newArr = arr1.slice(); arr1[2][0] = 'changed'; console.log(newArr); // not a deep clone let arr2 = [1, 2, [3 ,4]]; let newArrDeepclone = JSON.parse(JSON.stringify(arr2)); arr2[2][0] = 'changed'; console.log(newArrDeepclone); // A deep clone, values unchanged |
如果您的javascript在mooolts中,那么框架将匿名提供
1 | var object = JSON.decode(string[, secure]); |
此外,
http://jsfiddle.net/chetabahana/qbx9b5pm/
试试这个。这个是用打字机写的。
1 2 3 4 5 6 7 | export function safeJsonParse(str: string) { try { return JSON.parse(str); } catch (e) { return str; } } |