2016-07-15 13 views
-2

Szenario Client eine GET-Anforderung wie diese in einem JSON-Format ist die Antwort machenNehmen regulären Ausdruck auf eine json Antwortdaten

 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" 
    ] 
}; 

Für die Zwecke dieses Beispiels ich das Ergebnis in einer Variablen gespeichert als „Daten ". Meine Regex Ausdrücke ist:

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

Der Grund ideia hier sein nur die Keynames zu bekommen neben ... innerhalb von und Objekt oder ein Array ist, da die Definition von keyname die in JSON ist „keyname“: Das ist, warum ich Ich versuche, den obigen Regex-Ausdruck zu verwenden.

Ich dachte sogar über dies mit einer rekursiven Funktion, aber funktioniert nicht.

+0

Warum regex für diesen Einsatz? JSON-Strings können in JavaScript, C#, Java und vielen anderen Sprachen leicht in tatsächliche Objekte umgewandelt werden. Es ist wirklich nicht notwendig, Regex zu verwenden. Machen Sie also bitte näher auf die Notwendigkeit von Regex aufmerksam oder forschen Sie, um daraus ein Objekt zu machen. Die Info ist da draußen. –

+0

Der Punkt hier verwendet keine Regex oder nicht. Ich möchte nur die Namen extrahieren, selbst wenn sie verschachtelt sind. Ich habe eine Regexp für Testzwecke verwendet – Eudes

Antwort

0

Dies wird Ihnen alle die keys als die Spiele:

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

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

Edited mit mehreren keys auf einer Linie zu arbeiten.

+0

Dies funktioniert nicht, wenn mehrere Schlüssel in einer Zeile sind. Das '+' ist zu gierig. – 4castle

1

Sie sollten niemals nicht reguläre Strukturen mit regulären Ausdrücken analysieren.

Sammeln Sie einfach was Sie wollen von geparsten JSON-Objekt.
Führen Sie einfach data = JSON.parse(json_string) für Parse es

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"] 

Sie sie filtern, sortieren, Zifferntasten ausschließen ... Alles, was Sie brauchen.

+1

Danke, Sir, das ist was ich wirklich brauchte. – Eudes

0

Sie brauchen dafür keinen regulären Ausdruck. Javascript hat eine eingebaute Funktion, um Objektschlüsselnamen zu extrahieren.

Beispiel:

Verwendung 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" 
    ] 
}; 

Dann

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

sollte

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

Proof drucken: http://codepen.io/theConstructor/pen/zBpWak

nun alle Ihre Objektschlüssel sind in einem Array gespeichert ..

hoffe, das hilft