给定一个JSON数据字符串,如何安全地将该字符串转换为一个JavaScript对象?
很明显,你可以用像…
1
| var obj = eval("(" + json + ')'); |
…但这会使我们容易受到包含其他代码的JSON字符串的攻击,这对于简单地评估似乎非常危险。
只要你能保证一个相当现代化的浏览器,JSON.parse(jsonString)就是一个纯粹的javascript方法。
jquery方法现在已弃用。改为使用此方法:
1
| let jsonObject = JSON.parse(jsonString); |
使用已弃用的jquery功能的原始答案:
如果使用jquery,只需使用:
1
| jQuery.parseJSON( jsonString ); |
这正是您要查找的内容(请参见jquery文档)。
编辑:这个答案适用于IE<7,对于现代浏览器,请查看上面的乔纳森的答案。
编辑:这个答案过时了,乔纳森的回答(JSON.parse(jsonString))现在是最好的答案。
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,您也可以使用$.getJSON(url, function(data) { });。
然后你可以做像data.key1.something、data.key1.something_else等事情。
1 2 3 4 5 6
| $.ajax({
url: url,
dataType: 'json',
data: data,
success: callback
}); |
回调将传递返回的数据,该数据将是JSON结构定义的javascript对象或数组,并使用$.parseJSON()方法进行分析。
尝试使用此数据对象的方法。例:Data='{result:true,count:1}'
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))() |
使用parse()方法最简单的方法是:
1 2
| var response = '{"result":true,"count":1}';
var JsonObject= JSON.parse(response); |
然后可以得到Json元素的值,例如:
1 2
| var myResponseResult = JsonObject.result;
var myResponseCount = JsonObject.count; |
使用文档中描述的jquery:
使用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'
}); |
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
正式记录:
JSON.parse()方法解析JSON字符串,构造由该字符串描述的javascript值或对象。可以提供可选的reviver函数,以便在返回结果对象之前对其执行转换。
句法
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); |
您还可以使用reviver函数进行过滤。
1 2 3
| var data = JSON.parse(jsonString, function reviver(key, value) {
//your code here to filter
}); |
有关更多信息,请阅读json.parse
我知道,以前的问题,但是没有人注意到使用new Function()这个返回数据的匿名函数的解决方案。
举个例子:
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对象。
这里,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中,那么框架将匿名提供JSON.parse。安全地将JSON字符串转换为对象的有效语法应该是:
1
| var object = JSON.decode(string[, secure]); |
此外,JSON Request可以引发一个能够直接解析的对象。您可以在这里讨论如何转换JSON原始数据:
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;
}
} |