Newsgroup: it.comp.lang.delphi
Titolo: Estrarre dati da una "stringa" JSon

Ciao a tutti,
  dopo essere riuscito a fare le chiamate in modo corretto al server di 
skebby via rest, ogni chiamata mi da delle risposte.
La risposta che devo per forza interpretare e' quella in cui ho a 
disposizione il tipo di messaggio e il numero di messaggi disponibili 
per quel tipo.
Questa e' la stringa
 
{
     "money": null,
     "sms": [
         {
             "type": "SI",
             "quantity": 16079
         },{
             "type": "TI",
             "quantity": 11815
         },
         {
             "type": "GP",
             "quantity": 10407
         },
         {
             "type": "EE",
             "quantity": 10387
         }
     ],
     "email": {
         "bandwidth": 2000.0,
         "purchased": "2015-01-16",
         "billing": "EMAILPERHOUR",
         "expiry": "2016-01-17"
     }
}
 
Ora, come posso lavorarmi questa stringa in modo da avere in memo questo 
output ?
 
money = nessun credito
sms:
SI = 16079
TI = 11815
GP = 10407
EE = 10387
 
Sto tentando divrsi approcci ma non riesco ad arrivare al risultato 
necessario.
 
Grazie per l'aiuto.
 
Buon anno a tutti
 
Ciao
Daniele

Ciao Daniele,
 
Se la versione Delphi che stai utilizzando č abbstanza recente hai la unit 
System.JSON.
 
Fai il parse del JSON:
 
LJSONValue := TJSONObject.ParseJSonValue('{"money": null, "sms": [...]}');
 
Leggi i valori:
 
LJSONValue.GetValue<T>('money', nil);
 
Trovi la documentazione qui:
 
https://docwiki.embarcadero.com/Libraries/Sydney/en/System.JSON
 
 
Buon anno,
David
 
 

 
 
Grazie David per il suggerimento.
Ora, sempre partendo dall'esempio che ti mandato, ho un nuovo problemino.
Com'e' possibile recuperare gli oggetti e gli array compresi nella 
stringa json?
 
con questo codice (funziona pe ril mio scopo)
 
procedure ParseJson(StrJson : string);
var
   S          : string;
   LJsonArr   : TJSONArray;
   LJsonValue : TJSONValue;
   LItem      : TJSONValue;
   jo, jo1    : TJSONObject;
   myarr      : TJSONArray;
   I : Integer;
 
begin
    Form1.Memo1.lines.add('');
    jo := TJSONObject.ParseJSONValue(StrJson) as TJSONObject;
   try
     if jo.TryGetValue('sms', myarr) and (myarr.Count > 0) then
     for I := 0 to myarr.Count -1  do
     begin
       if (myarr.Items[I] is TJSONObject) then
       Begin
         jo1:= (myarr.Items[I] as TJSONObject);
         Form1.Memo1.lines.add(jo1.GetValue('type').ToString +
            #32 + ':' + jo1.GetValue('quantity').ToString);
       End;
     end;
 
   finally
     jo.Free;
   end;
end;
 
trovo il valore "sms" che conosco.
Ma se non conosco "sms" com'e' possibile ricavarlo?
Ed infine com'e' possibile rendere recursiva la lettura della stringa 
json quado ci sono piu' oggetti che inglobano, magari, piu' array?
 
Scusami se non soo troppo chiao ...
 
Buon anno a tutti
 
Daniele

 json quado ci sono piu' oggetti che inglobano, magari, piu' array? 
 
Intanto, la parola "stringa" mettila da parte. Stai leggendo un PACCHETTO JSON.
Poi, il fatto che nel pacchetto ci siano degli array non vuol dire che TU debba usare degli array del kazzo....
Devi avere:
 
1) una CLASSE per ogni oggetto che descrive il pacchetto completo
 
2) una COLLECTION per ogni oggetto che può avere più occorrenze nel pacchetto completo
 
3) una o più CLASSI che aggregano quanto descritto ai punti 1 e 2
 
Nel tuo caso:
 
una classe SMSItem
con una property Quantity e una property ItemType NON DI TIPO STRINGA MA DI UN TIPO ENUMERATO CHE MAPPA 1:1 I VALORI SI, TI, GP, EE
 
una classe COLLECTION SMSItemList che può contenere da zero a n oggetti di classe SMSItem
 
una classe EMAILInfo che ha le property:
bandwidth
purchased
billing
expiry
 
infine, una classe alla quale non so dare un nome (per ora la chiamo QUALCOSA...) che ha le property:
smsitemlist: SMSItemList 
email:  EMAILInfo 
 
Quindi, tu fai il parsing.
Quando becchi "SMS", per ogni elemento fai un ADD alla collection QUALCOSA.smsitemlist.
Quando becchi "EMAIL" leggi i valori e li scrivi nelle property di QUALCOSA.email.
 
 
 
 
 
A.
 
 
 


Grazie Alberto.
 
Ti ragguaglio appena riesco, tempo permettendo, a metterci le mani sopra...
 
Buona epifania ..
 
Ciao
Daniele