将正则表达式应用于 json 响应数据



>场景客户端发出 GET 请求,响应采用如下所示的 JSON 格式

     var data = {
    "enabled": true,
    "state": "schedule",
    "schedules": [
        {
        "rule": {
        "start": "2014-06-29T12:36:26.000",
        "end": "2014-06-29T12:36:56.000",
        "recurrence": [
        "RRULE:FREQ=MINUTELY"
        ]
        },
        "wifi_state_during_rule": "disabled",
        "end_state": "enabled"
        }
    ],
    "calculated_wifi_state_now": "disabled",
    "time_of_next_state_change": [
        "2014-07-08T18:56:56.000Z",
        "2014-07-08T18:57:56.000Z"
    ]
};

出于此示例的目的,我将结果存储在名为"data"的变量中。我的正则表达式是:

checkPattern = /"w+"(?=:)/ //all keys "keyname": ...

这里的基本思想只是为了获取键名,除了在对象或数组内部......由于 JSON 中键名的定义是"键名":这就是我尝试使用上述正则表达式的原因。

我什至想过使用递归函数执行此操作,但不起作用。

永远不应该使用正则表达式解析非正则结构。

只需从解析的 json 对象中收集您想要的内容即可。
只需运行data = JSON.parse(json_string)即可解析它

function getKeysRecursive(obj) {
  var result = [];
  for (var key in obj) {
    result.push(key);
    if (typeof obj[key] == 'object') {
       result = result.concat(getKeysRecursive(obj[key]));
    }
  }
  return result;
}
getKeysRecursive(({
    "enabled": true,
    "state": "schedule",
    "schedules": [
        {
        "rule": {
        "start": "2014-06-29T12:36:26.000",
        "end": "2014-06-29T12:36:56.000",
        "recurrence": [
        "RRULE:FREQ=MINUTELY"
        ]
        },
        "wifi_state_during_rule": "disabled",
        "end_state": "enabled"
        }
    ],
    "calculated_wifi_state_now": "disabled",
    "time_of_next_state_change": [
        "2014-07-08T18:56:56.000Z",
        "2014-07-08T18:57:56.000Z"
    ]
}))
// ["enabled", "state", "schedules", "0", "rule", "start", "end", "recurrence", "0", "wifi_state_during_rule", "end_state", "calculated_wifi_state_now", "time_of_next_state_change", "0", "1"]

您可以过滤它们,排序,排除数字键...应有尽有。

你不需要正则表达式。Javascript有一个内置的函数来提取对象键名。

例:

使用 Object.keys();

 var data = {
    "enabled": true,
    "state": "schedule",
    "schedules": [
        {
        "rule": {
        "start": "2014-06-29T12:36:26.000",
        "end": "2014-06-29T12:36:56.000",
        "recurrence": [
        "RRULE:FREQ=MINUTELY"
        ]
        },
        "wifi_state_during_rule": "disabled",
        "end_state": "enabled"
        }
    ],
    "calculated_wifi_state_now": "disabled",
    "time_of_next_state_change": [
        "2014-07-08T18:56:56.000Z",
        "2014-07-08T18:57:56.000Z"
    ]
};

然后

console.log(Object.keys(data));

应该打印

["enabled","state","schedules","calculated_wifi_state_now","time_of_next_state_change"]

证明:http://codepen.io/theConstructor/pen/zBpWak

现在,所有的对象键都存储在一个数组中。

希望这有帮助

这将为您提供匹配的所有keys

"(w+)(?:":)

https://regex101.com/r/iM9wB3/2

经过编辑以在一行上处理多个keys

最新更新