2016-07-15 53 views
-2

方案客户端进行GET请求的响应是在一个JSON格式像这样的应用正则表达式表达为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" 
    ] 
}; 

对于此示例的目的,我所存储的结果在一个变量被称为“数据”。 我的正则表达式表达式是:

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

基本IDEIA这里它只是为了让键名,除了因为JSON的键名的的定义是对象或数组......和里面“键名”:这就是为什么我m试图使用上面的正则表达式。

我甚至想过用递归函数做这件事,但没有工作。

+0

为什么要使用正则表达式呢? Json字符串可以很容易地变成javascript,c#,Java和其他许多语言中的实际对象。真的不需要使用正则表达式。所以请详细说明对正则表达式的需求,或者做一些研究来将它变成一个对象。信息在那里。 –

+0

这里的重点不是使用正则表达式。 我想只提取名称,甚至认为它们是嵌套的。 我用测试目的的正则表达式 – Eudes

回答

0

这会给你所有的keys的比赛:

\"(\w+)(?:\"\:)

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

编辑与多个keys在一行上工作。

+0

如果一行上有多个键,这不起作用。 '+'太贪婪了。 – 4castle

1

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

只是从解析的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"] 

您可以过滤它们,排序,排除数字键......你需要什么所有。

+1

谢谢先生,那是我真正需要的。 – Eudes

0

你不需要这个正则表达式。 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

现在所有的对象键被存储在一个数组..

希望这有助于