如何从JSON字符串中检索多个属性值

时间:2016-03-01 06:08:52

标签: javascript json regex grouping extract

我有一个JSON字符串:

x = '{"userId":"foo","traits":{"email":"foo@foobar.com"},"type":"identify"}'

我希望从中获取某些值。我试过正则表达式:

到目前为止我已经

anonId = x.match(/\"anonymous_id\"\:(.*?)/)?[1]
email = x.match(/\"email\"\:\"(.*?)\"/)?[1]
userId = x.match(/\"userId\"\:\"(.*?)\"/)?[1]
type = x.match(/\"type\"\:\"(.*?)\"/)?[1]

这是丑陋而低效的,但当我尝试将它们组合时:

[_, a, b, c, d] = x.match(/\"anonymous_id\"\:(.*?)|\"userId\"\:(.*?)|\"email\"\:(.*?)|\"type\"\:(.*?)/g)

返回的结果是整个组,而不仅仅是匹配的部分。

我希望a,b,c,d等于键的值,但我得到:

Wanted:
**>> ["foo","foo@foobar.com","identify"]**
Actual results:
>> ["userId":"foo","email":"foo@foobar.com","type":"identify"]

有没有办法在一行正则表达式中实现这一目标?

--- UDPATE ----

我最终选择了

  rxp = /\"user_id\"\:\"(.*?)\"|\"anonymous_id\"\:\"(.*?)\"|\"type\"\:\"(.*?)\"/g

  anonId = null
  userId = null
  type = null

  while (arr = rxp.exec(bdy)) isnt null
    userId = arr[1] if arr[1]
    anonId = arr[2] if arr[2]
    type = arr[3] if arr[3]

FWIW我避免使用JSON.parse,因为我处理了数以千计的这些,因为我只需要一小部分,我不希望JSON.parse的缓慢影响不必要的服务器。

2 个答案:

答案 0 :(得分:2)

try {
   var parsed = JSON.parse(x);
   anonId = parsed.anonymous_id;
} catch (ex) {
  //invalid json
}

除非你有无效的JSON,否则这应该有用。然后你可能想要考虑正则表达式,但即使这样你也可能想要查看模板。

答案 1 :(得分:0)

一次拨打RegExp

,尝试使用/[a-z@.]+(?=",|"})/ig .match()

var x = '{"userId":"foo","traits":{"email":"foo@foobar.com"},"type":"identify"}';
var res = x.match(/[a-z@.]+(?=",|"})/ig);
console.log(res);