Javascript 将字符串转换为对象数组
Posted
技术标签:
【中文标题】Javascript 将字符串转换为对象数组【英文标题】:Javascript Convert String to Array of Objects 【发布时间】:2013-04-19 07:05:14 【问题描述】:我有一个接受字符串的 NodeJS 应用程序(已上传输入!)我对输入没有无法控制 我只是为进程构建一个 REST 服务 数据。
该字符串 意味着 是 JSON 对象 的 Array,然后我可以循环提取每个元素... p>
我接收以下内容(作为字符串):
[
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
我的第一直觉是用字符串替换键(例如,将名称改为“名称”),然后尝试解析它。但如果其他人有解决方案,我将不胜感激。
【问题讨论】:
用户必须输入 JSON? 第一个不是json格式 嗨@ExplosionPills 我应该澄清一下它是一个接受 JSON 的网络服务。上传的字符串不是由用户手动输入的,而是由 JAVA 应用程序(不受我控制)生成并发送到我的 NodeJS 应用程序进行处理。他们正在向我发送无效的 JSON... :-( 【参考方案1】:创建一个 javascript 类,用您的输入填充对象,然后使用 JSON.stringify(object)
将其转换为干净的 json 以避免错误。 My full post here.
注意:如果您使用 IE7 或更低版本,则必须添加 JSON.js
库才能使用 JSON.stringify()
函数。
【讨论】:
我忘了指定版本:P 这是要走的路。在客户端使用 JSON.stringify() 对对象进行字符串化。服务器将收到一个有效的 json。 @MaximilianoBecerraBustamante 我的问题与IE或在客户端。我试图在 question 中说明我对 input 没有控制。我以 string 的形式 receiving 数据,所以 JSON.stringify(string) 对我来说是 useless ... :-( @nelsonic 你看到我的博客了吗? JSON.stringify 是解决方案的最后一步,建议解决方案的关键是创建一个 javascript 类(它可能是一个具有多个级别的复杂对象),然后创建该类的一个实例并用生成的数据填充它输入(您的数据字符串)。当您准备好并填充对象后,您可以使用 JSON.stringify 根据 javascrit 对象(使用 javascript 类构造)生成干净的 JSON :-) @nelsonic 如果您不需要 JSON.stringify 函数,javascript 中的对象是使用定义的结构存储数据的最佳方式,然后您可以随意处理它:-)跨度> 【参考方案2】:您可以通过一些正则表达式替换来做到这一点:
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 处理此类事情并不理想,并且此解决方案仅在特定情况下有效(例如此示例)。如 cmets 中所述,一个问题是数据值是否包含冒号 :
考虑到这一点,这是一个更可靠的解决方案:
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
【讨论】:
所以数据字符串中不允许使用冒号? @GSerg:不,当然不是,别傻了!但是,是的,它肯定是不稳定的,但如果可以对 JSON 数据做出这些假设,那就没问题了。 @musefan 感谢您的及时和彻底的回复!一些字段名称带有下划线。例如Default__c(Salesforce 自定义字段!)但正则表达式不喜欢它们。我需要在字段名称中允许“_c”或“”。想法? @nelsonic:如果你想要下划线,那么你可以使用这个正则表达式来替换部分:$1.replace(/([_a-zA-Z0-9]+?):/g, '"$1":');
@musefan 同意了。数据太复杂。我试图用一种简单的方式来表达这个问题。但考虑到 URL 和包含单引号和冒号等的数据。我不得不更有创意。非常感谢您的回答,我会投票!以上是关于Javascript 将字符串转换为对象数组的主要内容,如果未能解决你的问题,请参考以下文章
在javascript中如何将字符串转换为数组和数组转换为字符串
使用两个中间 $.getJSON 调用将字符串数组转换为对象数组