如何将长字符串转换为JSON对象?

时间:2012-01-26 22:34:23

标签: javascript jquery

我需要将字符串转换为从学习管理系统返回的JSON对象。一旦字符串是一个JSON对象,我将把它用作我正在编写的jQuery插件的一部分。以下是我到目前为止的情况:

回调转换:(我无法访问服务器端代码(它驻留在LMS(AICC)上,我只是通过javascript访问它,回调在下面,所以我我坚持使用这个文本。我确实相信每行后都有\ n,但这是我收到的确切格式......除了文本之外什么都没有。)

ERROR=0
ERROR_TEXT=Successful
VERSION=2.2
AICC_DATA=[CORE]
STUDENT_ID=01234567
STUDENT_NAME=Doe, John R
SCORE=83
TIME=02:35:37
CREDIT=C
LESSON_LOCATION=page_1               
LESSON_STATUS=INCOMPLETE
[Core_Lesson]
[Objectives_Status]

我正在寻找将其转换为:

{'ERROR':'0','ERROR_TEXT':'Successful','VERSION':'2.2','AICC_DATA':'[CORE]','STUDENT_ID':'01234567','STUDENT_NAME':'Doe, John R','SCORE':'83','TIME':'02:35:37','CREDIT':'C','LESSON_LOCATION':'page_1','LESSON_STATUS':'INCOMPLETE'}

这是我正在使用的jQuery :(如你所见,我正在尝试在没有循环的情况下执行此操作:)

$.get(_url,{command:"GetParam",version:"2.2",session_id:_sid},function(response)
{
    /* this is my attempt at using a RegExp */
    var match = RegExp('[?&]' + urlVar + '=([^&]*)').exec(response); 
    /* I thought maybe I could do it using an eval(), but I get an error -> Expected "]" */
    var t = eval('{['+response+']}');                       
});

我相信我可以使用循环来解决这个问题,但我真的希望在没有for循环的情况下使用它。这甚至可能吗?谢谢!

3 个答案:

答案 0 :(得分:2)

如果您的行以“\ n”结尾,那么您可以尝试:

var obj = {};
theTextYouGetFromTheServer.replace(/([^=]+)=(.*)\n/g, function(_, name, value) {
  obj[name] = value;
});

如果你的名字可以包含“=”,那当然是个问题。

它的作用是匹配您的名称/值行的基本格式(NAME = VALUE)并构建一个对象。字符串的JavaScript .replace()方法调用每次连续匹配重复运行,参数是整个匹配(这里我们不关心),然后是每个匹配的组(正则表达式中的parens中的东西)

答案 1 :(得分:0)

试试这个:

var text = "ERROR=0\nERROR_TEXT=Successful\nVERSION=2.2\nAICC_DATA=[CORE]\nSTUDENT_ID=01234567\nSTUDENT_NAME=Doe, John R\nSCORE=83\nTIME=02:35:37\nCREDIT=C\nLESSON_LOCATION=page_1               \nLESSON_STATUS=INCOMPLETE";

eval('var object = {' + text.replace(/([^=\n]+)=([^\n]+)/g, '"$1":"$2",').replace(/\n/g, "") + '}');

alert(object.SCORE);

如果你有最后两行([Core_Lesson][Objectives_Status]),这不起作用。

答案 2 :(得分:0)

只需发布我的版本。如果不好,请随时纠正我。

function toJSON (str) {
     return  '{\'' + str.replace(/=/g, "':'").replace(/\n/g, "','") + '\'}';
}