2009-09-23 169 views
3

我有一个硬编码的JSON字符串。解析JSON字符串

var test = "JSON STRING HERE"; 

我正在使用jQuery。我知道有一个像getJSON这样的函数,但是这会产生一个AJAX调用。我希望它解析硬编码字符串,以便我可以使用$.each(test, function(a,b){}))

谢谢您的时间。

回答

11

原题:

jQuery让不包括可公开访问的JSON解析器或编码器的一个点。他们希望你为此使用第三方库。

我推荐了一个在json.org主办:

https://github.com/douglascrockford/JSON-js/blob/master/json2.js

或者,您可以使用托管在谷歌代码jQuery的JSON插件:

http://code.google.com/p/jquery-json/


在回答“为什么不jQuery的使它的可用解析器?”:

的jQuery实际上并不包括任何种类的解析器。在jQuery代码库的AJAX部分,你可以看到他们在lines 572-579上做了什么。

快速的说法是,他们实际上做一次检查,看看是否你已经包括外部的JSON库如来自json.org的一个,如果它发现它,他们用它来解析。如果你没有包含一个,他们返回包装在一个函数中的json,并有效地返回它进行评估。非常棘手,但非常聪明!

+1

针对jQuery插件的+1。我喜欢它,当它与图书馆- – Daff 2009-09-23 07:14:35

+0

谢谢。为什么jQuery不能使解析器公开访问? – 2009-09-23 07:30:14

+0

@Alec,你知道,这是一个很好的问题。我将用该信息编辑我的答案。 – 2009-09-23 08:02:40

0

不幸的jQuery不支持JSON解析与JSON或JSONP的AJAX功能外部作为数据类型(反序列化SI非常紧密地结合到AJAX和回调代码)。当然,你可以只是做一个

var obj = eval(test); 

但是,这绝对不是recommened方式(除了当你肯定知道你的字符串只是一个JavaScript对象,而不是任意的源代码被执行)。所以最好的方法可能是使用另一个库,如JSON2 library(在json.org上找到)。

1

这里是jQuery不会在Ajax请求时,数据类型设置为“JSON”(这是的getJSON做什么,引擎盖下):

window["eval"]("(" + data + ")"); 
+0

+1,用于指出jQuery的功能。不是为了方法本身。啊。 – eyelidlessness 2009-09-23 07:25:18

+0

这就是它最终会回到,虽然它不直接在那里。他们实际上首先检查外部解析库(一个名为JSON的对象),然后如果他们没有找到它,它将它包装在一个函数调用中,然后将它发送到eval。 – 2009-09-23 08:09:20

5

你的人意识到,这JSON表示“的JavaScript对象符号“?如果你有JavaScript对象表示法硬编码,那么只要松开引号,并且完成解析它,因为JavaScript解析器将处理此问题。

var jsonstr = "{prop1: 'val1', prop2: 'val2'}"; 
var parsed = {prop1: 'val1', prop2: 'val2'}; 

很简单,不是吗?!!可能有些东西我不知道,但对我来说,理解用JavaScript编写解析器的人很难......当然,如果您不确定jsonstr的源代码安全性,那么直接对其进行评估可能不是最好的想法,但是如果您只控制了源代码,尤其是在对代码进行硬编码时就像它在问题中所说的那样,然后只是放松引号!