Javascript将字符串转换为对象数组

时间:2013-04-25 11:44:56

标签: javascript json node.js parsing malformed

我有一个NodeJS应用程序,它接受一个字符串(上传的输入!)我对输入无控制我只是为进程构建一个REST服务数据。

该字符串意味着 JSON对象数组,然后我可以循环以提取每个元素...

接收以下内容(作为字符串):

[
  {Name: 'Jane',
       Id: '005b0000000MGa7AAG'},
  {Name: 'Tom',
       Id: '005b0000000MGa7AAF'}
]

当我尝试 JSON.parse 时,我得到了

SyntaxError: Unexpected token N

可以理解,因为我知道这是无效的JSON

下一个字符串是有效的JSON 并传递http://jsonlint.com/

[
    {"Name": "Jack",
        "Id": "005b0000000MGa7AAA"},
    {"Name": "Jill",
        "Id": "005b0000000MGa7AAB"}
]

我的问题是:如何我可以接受第一个输入并解析它以允许:

parsed[0]['Name'] == 'Jane'
>> true

我的第一直觉是将字符串替换为键(例如,Name为“Name”),然后尝试解析它。但如果其他人有解决方案,我将不胜感激。

2 个答案:

答案 0 :(得分:11)

你可以用一些Regex替换来实现这个目的:

var json = "[ {Name: 'Jane', Id: '005b0000000MGa7AAG'}, {Name: 'Tom', Id: '005b0000000MGa7AAF'} ]";

var newJson = json.replace(/([a-zA-Z0-9]+?):/g, '"$1":');
newJson = newJson.replace(/'/g, '"');

var data = JSON.parse(newJson);

alert(data[0]["Name"]);

首先,我们用引号包装属性名称,然后用双引号替换单引号。这足以使它成为有效的JSON,然后可以对其进行解析。

Here is a working example


注意:一般情况下使用RegEx这样的事情并不理想,此解决方案仅适用于特定情况(如本示例)。正如评论中所提到的,如果数据值包含冒号:

,则会出现一个问题

考虑到这一点,这是一个更可靠的解决方案:

var json = $("div").html();

var newJson = json.replace(/'/g, '"');

newJson = newJson.replace(/([^"]+)|("[^"]+")/g, function($0, $1, $2) {
    if ($1) {
        return $1.replace(/([a-zA-Z0-9]+?):/g, '"$1":');
    } else {
        return $2; 
    } 
});

var data = JSON.parse(newJson);
alert(data[0]["Name"]);

这将匹配以冒号:结尾的任何变量(字母数字),但会在引号之间找到任何匹配(即数据字符串值)

Here is an example

答案 1 :(得分:1)

创建一个javascript类,使用输入填充对象,然后使用:JSON.stringify(object)在干净的json中转换它以避免错误。 My full post here

注意:如果您使用的是IE7或更低版​​本,则必须添加JSON.js库才能使用JSON.stringify()功能。

相关问题