2015-06-13 10 views
6

Sto tentando di analizzare questa risposta del calendario di Google che sto ottenendo dalla loro API Rest utilizzando C#, ma mi sembra di rimanere bloccata. [modificato] Aggiornamento, il simbolo @ non impedisce il drill down, ho verificato sostituendo @ con _at_. Vedere la schermata dell'orologio rapida: enter image description hereParsing Json in un oggetto C# dinamico con una chiave dinamica

Sono sicuro che sto Accedendo a questo modo non corretto ...

Ecco il jsonString che sto cercando di analizzare:

{ 
"kind": "calendar#freeBusy", 
"timeMin": "2015-06-12T14:00:00.000Z", 
"timeMax": "2015-06-14T14:00:00.000Z", 
"calendars": { 
    "[email protected]bs.com": { 
    "busy": [ 
    { 
    "start": "2015-06-13T18:30:00Z", 
    "end": "2015-06-13T19:30:00Z" 
    }, 
    { 
    "start": "2015-06-13T20:30:00Z", 
    "end": "2015-06-13T21:30:00Z" 
    }, 
    { 
    "start": "2015-06-13T23:00:00Z", 
    "end": "2015-06-14T00:00:00Z" 
    } 
    ] 
    } 
} 
} 

I' ve provato utilizzando:

dynamic myObj = Json.Decode(jsonString); 

e

var myObj = JsonConvert.DeserializeObject(jsonString); 

ma non riesco a capire come entrare nella chiave [email protected] (che è dinamica in base a ciò che invio) per scorrere tutti i tempi occupati.

Idee?

enter image description here

risposta

3

è possibile accedervi tramite un indicizzatore stringa:

var myObj = JsonConvert.DeserializeObject<dynamic>(jsonString); 
Console.WriteLine(myObj.calendars["[email protected]"]); 
+0

Così è stato, sono riuscito ad accedere alle proprietà usando questo metodo di accesso: myObj ["calendari"] ["[email protected]"] ["busy"] [0] .start Grazie! – user3491101

+0

Domanda, c'è un modo per ottenere in modo dinamico l'indirizzo email? Lo so, ma in futuro se non lo sapessi - come potrei accedervi? Esiste una sorta di proprietà del bambino o qualcosa di simile? – user3491101

+1

foreach (elemento var in myObj ["calendari"]) Console.WriteLine (item.Name) –

0

ho affrontato un problema simile in passato, tuttavia la mia era una questione di trattino, ho semplicemente sostituito con un trattino di sottolineatura. potresti potenzialmente fare qualcosa di simile ma visto che si tratta di un indirizzo e-mail, potrebbe essere meglio modificare lo schema (l'espressione regolare vedendo che ricevi json da un'API di terze parti) crea una nuova chiave "mail" in modo che tu puoi assicurarti di mantenere intatto l'indirizzo email originale.

Ma forse ancora più importante, come si esegue una query questa API forse si sapeva già l'e-mail, se è così semplice che si possa fare una regex sostituire:

 string json = '... {"[email protected]":...}...'; 
     Regex regex = new Regex(@"\b[A-Za-z0-9._%+-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b"); 
     string jsonfixed = regex.Replace(json, "email"); 
+0

Grazie Joachim, ho provato a sostituire il simbolo @, ma non mi ha aiutato a risolvere il mio problema - guarda lo screenshot di Quickwatch qui sopra. Sembra che sia un JSON annidato in Json? – user3491101