2011-11-08 84 views
3

我有一些JSON已从servlet传递并存储在xmlhttp.responseText中。我想分解这个JSON,以便我可以拥有数据,大小,样式,名称等的值。另外,我希望将小部件值设置为单独的变量。JavaScript中的JSON字符串解析

这里是JSON:

{ 
    "widget vlaue=2": { 
    "debug": "on", 
    "window": { 
     "title": "Sample Konfabulator Widget", 
     "name": "main_window", 
     "width": 500, 
     "height": 500 
    }, 
    }, 
    "image": { 
    "src": "Images/Sun.png", 
    "name": "sun1", 
    "hOffset": 250, 
    "vOffset": 250, 
    "alignment": "center" 
    }, 
    "text": { 
    "data": "Click Here", 
    "size": 36, 
    "style": "bold", 
    "name": "text1", 
    "hOffset": 250, 
    "vOffset": 100, 
    "alignment": "center", 
    "onMouseUp": "sun1.opacity = (sun1.opacity/100) * 90;" 
    } 
}  

我已经试过这样:

obj = JSON.parse(xmlhttp.responseText); 

但失败了。我在网上找不到与它相关的任何内容。任何人都可以帮助我吗?

+3

你是什么意思,它“失败”?你有没有从浏览器中得到任何错误? –

+0

这个输出是“undefined” – typedefcoder2

+0

你的意思是“输出是'未定义'这个”?什么是'这个'和'输出'是什么? –

回答

7

json.org

要将JSON文本转换成一个对象,你可以使用eval()函数 。 eval()调用JavaScript编译器。由于JSON是JavaScript的一个合适的子集,因此编译器将正确解析文本并生成对象结构。必须将文本包装在 父元素中,以避免跳出JavaScript语法中的歧义。

var myObject = eval('('+ myJSONtext +')');

但是JSON.parse仍建议:

eval函数是非常快的。但是,它可以编译并执行任何JavaScript程序,因此可能存在安全问题。当来源是可信和有效的时候指示使用 eval。使用JSON解析器更安全的多 。在通过XMLHttpRequest的Web应用程序中, 通信只允许与提供 页面的相同源,因此它是可信的。但它可能无法胜任。如果服务器 的JSON编码不严格,或者如果它没有严格地验证其所有输入,那么它可能会传递无效的JSON文本 ,这可能会携带危险的脚本。 eval函数 执行脚本,释放其恶意。

为了防御这一点,应该使用JSON解析器。 JSON解析器 将只识别JSON文本,拒绝所有脚本。在 提供本机JSON支持的浏览器中,JSON解析器也比 eval快得多。预计本地JSON支持将包含在 下一个ECMAScript标准中。

var myObject = JSON.parse(myJSONtext,reviver);

也许您的JSON出了问题,请访问jsonlint.com获取免费的基于Web的JSON验证程序。

+0

我的JSON已经从JSONLint验证过。在我使用Javascript之前,我一直在做这件事。 – typedefcoder2

+0

你说这是来自一个servlet,你是​​否100%确定该字符串没有被自动转义或修改?我曾经使用PHP来传递JSON字符串,正如您所知,双引号会将所有东西混淆,因为它没有在PHP中正确转义。由于每种语言都具有不同的转义字符,因此该servlet的预期输出可能已更改。尝试在服务器端打印出JSON字符串,以查看它是否完全正确,如上所述。 – Gapton

+0

那么上面的例子就是一个类似的例子。由于保密性,我无法发布确切的JSON。尽管我的JSON已经从JSONLint验证过。 – typedefcoder2

5

您的JSON,您提供的是无效。第9行包含额外的,,不应该在那里。

这是一个JSFiddle,没有,

http://jsfiddle.net/ApDsP/

+0

好眼睛,的确我相信是错误的。现在我知道了我不应该100%地依赖JSON验证器,因为不是所有的验证器都会检查结尾的逗号。 (我想这是因为并非所有的JSON库都禁止它) – Gapton

+0

我不知道JSON OP粘贴到JSlint中,但JSON在JSlint中也没有验证。 – Strelok

+0

其实,我** DID **复制并粘贴他的JSON到JSONLint,我第一次这样做,它的工作。现在我只是在5秒前再次尝试,并且它**失败**(当然,由于第9行中的逗号)。我认为OP或某人编辑了他在JSONLint中首次尝试验证它后发布的JSON。 – Gapton