Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Estrarre dati da una "stringa" JSon

68 views
Skip to first unread message

Daniele

unread,
Dec 28, 2022, 10:24:07 AM12/28/22
to
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

David Lastrucci

unread,
Dec 29, 2022, 3:51:37 AM12/29/22
to
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


Daniele

unread,
Dec 29, 2022, 10:01:49 AM12/29/22
to
Il 29/12/2022 09:51, David Lastrucci ha scritto:
> 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

Alberto Salvati

unread,
Jan 2, 2023, 6:36:28 AM1/2/23
to

> Ma se non conosco "sms" com'e' possibile ricavarlo?

Non puoi.

> Ed infine com'e' possibile rendere recursiva la lettura della stringa
> 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.



Daniele

unread,
Jan 3, 2023, 4:54:37 AM1/3/23
to
Grazie Alberto.

Ti ragguaglio appena riesco, tempo permettendo, a metterci le mani sopra...

Buona epifania ..

Ciao
Daniele
0 new messages