15

我有一个接受字符串的 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

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

4

2 回答 2

18

您可以通过一些正则表达式替换来做到这一点:

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,然后可以对其进行解析。

这是一个工作示例


注意:一般使用 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"]);

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

这是一个例子

于 2013-04-25T11:54:26.167 回答
2

创建一个 javascript 类,用您的输入填充对象,然后使用:JSON.stringify(object)以避免错误将其转换为干净的 json。我的完整帖子在这里

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

于 2013-04-25T12:02:59.523 回答