【问题标题】:Javascript Convert String to Array of ObjectsJavascript 将字符串转换为对象数组
【发布时间】: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... :-(

标签: javascript node.js json parsing salesforce


【解决方案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 和包含单引号和冒号等的数据。我不得不更有创意。非常感谢您的回答,我会投票!
猜你喜欢
  • 1970-01-01
  • 2018-09-25
  • 1970-01-01
  • 2017-08-24
  • 2014-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多