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中如何将字符串转换为数组和数组转换为字符串

将 HTML 表格(作为字符串)转换为 JS 对象数组

使用两个中间 $.getJSON 调用将字符串数组转换为对象数组

csv转换obj

如何将 BigQuery Struct Schema 字符串转换为 Javascript 对象?

js字符串每个数组前面数字转换为多少个数组