nel*_*nic 10 javascript parsing json malformed node.js
我有一个NodeJS应用程序接受一个字符串(上传输入!)我无法控制输入我只是构建一个REST服务来处理数据.
该字符串意味着是一个JSON对象数组,然后我可以循环以提取每个元素...
我收到以下内容(作为字符串):
[
{Name: 'Jane',
Id: '005b0000000MGa7AAG'},
{Name: 'Tom',
Id: '005b0000000MGa7AAF'}
]
Run Code Online (Sandbox Code Playgroud)
当我尝试JSON.parse时,我得到了
SyntaxError: Unexpected token N
Run Code Online (Sandbox Code Playgroud)
可以理解的是,因为我知道这是无效的JSON
而这接下来的字符串是有效的JSON并将http://jsonlint.com/:
[
{"Name": "Jack",
"Id": "005b0000000MGa7AAA"},
{"Name": "Jill",
"Id": "005b0000000MGa7AAB"}
]
Run Code Online (Sandbox Code Playgroud)
我的问题是:我如何接受第一个输入并解析它以允许:
parsed[0]['Name'] == 'Jane'
>> true
Run Code Online (Sandbox Code Playgroud)
我的第一直觉是将字符串替换为键(例如,Name为"Name"),然后尝试解析它.但如果其他人有解决方案,我将不胜感激.
mus*_*fan 12
您可以使用一些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"]);
Run Code Online (Sandbox Code Playgroud)
首先,我们用引号包装属性名称,然后用双引号替换单引号.这足以使其成为有效的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"]);
Run Code Online (Sandbox Code Playgroud)
这将匹配以冒号结尾的任何变量(字母数字):
,但会在引号之间找到任何匹配(即数据字符串值)