我有一个接受字符串的 NodeJS 应用程序(上传的输入!)我对输入没有无法控制 我只是在为进程构建一个 REST 服务 数据。
那个字符串意味着是JSON Objects的Array,然后我可以循环提取每个元素...
我接收以下内容(作为字符串):
[
{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"}
]
我的问题是:如何我可以接受 first 输入并解析它以允许:
parsed[0]['Name'] == 'Jane'
>> true
我的第一直觉是用字符串替换键(例如,将名称改为“名称”),然后尝试解析它。但如果其他人有解决方案,我将不胜感激。
最佳答案
您可以通过一些正则表达式替换来做到这一点:
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"]);
这将匹配以冒号 :
结尾的任何变量(字母数字),但会忽略在引号之间找到的任何匹配项(即数据字符串值)
关于Javascript 将字符串转换为对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16213864/