2011-07-20 74 views
0

我有一个AJAX调用收到此JSON字符串:解析使用Javascript

{status:OK,addresses:[0,1,2,3,4,5]} 

要将其转换成JSON对象我有这样一行:

var jsonObj = eval(jsonString); 

但会抛出异常!这个在异常变量中没有消息。 我也使用

{"status":"OK","addresses":[0,1,2,3,4,5]} 

尝试和,再次,抛出一个异常,但说了意外字符“&”被发现。

我正在使用Struts2,并且从行动中收到JSon。

任何帮助将不胜感激。 谢谢

+2

这不是一个JSON字符串,它甚至不是有效的JavaScript对象字面值。 n是JSON,我期望'eval'来处理它(但应避免使用'eval',去获取json2.js)。由于数据中没有'&',因此它必须来自您没有提供的代码。由于我们看不到,我们无法告诉您如何解决这个问题。 – Quentin

+0

所以我确认当JSon从请求收到时,所有的“被替换为" ......这可能是问题吗? –

+0

是的!解析器期望JSON不是HTML编码的JSON! – Quentin

回答

3
{status:OK,addresses:[0,1,2,3,4,5]} 

不是有效的JSON,因为引号statusaddresses丢失,并且是因为报价没有有效的JSON也没有有效的JavaScript大约在OK缺失。

此外,请勿使用eval来解析JSON - 它允许攻击者在页面上下文中执行任意JavaScript。相反,请使用安全替代品JSON.parse(内置于现代浏览器和其他EcmaScript 5实现)或JSON2

+0

@ Stargazer712你能提供一个源代码吗?http://json.org的官方语法非常清楚引用Python的,Chromium的解析器和[trivialjson](https://github.com/phihag/trivialjson)(我的解析器;))拒绝了'{a:1}'。 – phihag

0

这是为我工作:

JSON.parse('{ "status" : "OK", "addresses" : [0,1,2,3,4,5]}'); 
0

如果你想使用eval,那么您需要使用您发布的例子({"status":"OK","addresses":[0,1,2,3,4,5]}),你需要用括号包围的字符串,例如:

var jsonObj = eval('('+jsonString+')'); 

这使得jsonString有效javascript语句。

说到这里,我鼓励你使用JSON.parse,正如其他人发布的一样。它更安全。

+1

parens似乎并不对我来说是必需的。见http://jsfiddle.net/jfriend00/FcSKR/。 – jfriend00

+0

@ jfriend00,那是因为你没有*定义一个JSON字符串,而是你定义了一个字面的JavaScript对象。 http://jsfiddle.net/FcSKR/2/ – riwalk

+0

是的,我的错误 - 对不起。 – jfriend00

1

请勿使用eval:请使用适当的JSON解析器,如JSON2

您可能在响应中有额外的内容:请检查您是否打印了其他任何内容。

0

两个问题解决:

  1. 添加引号的“OK”,使之成为法律JavaScript字符串。
  2. 字符串周围添加括号发送给eval这样eval("(" + jsonString + ")")';

之前,此:

{status:OK,addresses:[0,1,2,3,4,5]} 

就必须改变这一点:

{status:"OK",addresses:[0,1,2,3,4,5]} 

是有效的JavaScript(注意“OK”左边的引号)。

它应该是这是有效的JSON(周围的按键报价太):

{"status":"OK", "addresses":[0,1,2,3,4,5]} 

确定全部由自己也不是没有它周围的报价已知一段JavaScript代码,使之成为一个JavaScript字符串。在未来,你可以测试自己在一个小的测试床,看到的错误是在你最喜欢的JavaScript调试器是什么:

http://jsfiddle.net/jfriend00/FcSKR/

var jsonString = '{"status":"OK","addresses":[0,1,2,3,4,5]}'; 
var jsonObj = eval("(" + jsonString + ")"); 
alert("success"); 

如果仍然得到一个错误与{"status":"OK","addresses":[0,1,2,3,4,5]}和括号的加入在发送到eval之前,那么您的数据不是您认为的数据,您需要进行一些调试以确切了解响应中的内容(查看调试器中的值,将值放入警报等。 )。响应中可能还有其他一些东西,你不知道会在那里。

注意:在某些情况下,像JSON.parse()这样的JSON解析器和合法的JSON字符串比使用Javascript的eval()更安全,可以是任何东西。

+0

这不是一个JSON字符串,而是一个字面JavaScript对象。括号是必需的。 http://jsfiddle.net/FcSKR/2/ – riwalk

+0

好吧,我在它周围添加了parens,尽管我的帖子主要是讨论Javascript和使用eval,因为这是OP所使用的。 – jfriend00

+0

你真的不明白。你仍然没有做任何事情,远远接近他所要求的。 *请*看看我发布的小提琴。它解释了你所做错的一切。 – riwalk

0

您没有JSON字符串。你确实有一个对象文字。你需要名称来引号。

{"status":OK, "addresses":[0,1,2,3,4,5]} 
+0

OP没有使用JSON解析器,只是eval所以真的只是需要它是有效的JavaScript,它需要引号围绕“OK”而不是对象键。 – jfriend00

0

基于此评论:

所以我核实,当从收到请求JSON,所有被"改为“......难道这是问题

是的,一个JSON解析器期望接收JSON作为输入,而不是HTML编码的JSON