ho una funzione Delphi alla quale arrivano oggetti JSON fatti in
questo modo:
'{"1":"10","2":"510"}'
oppure
'{"1":"10","2":"510", "10":"625"}'
ovvero sono coppie di stringhe (contenenti solo caratteri numerici).
Ho bisogno di trasformarlo in un qualche oggetto Delphi in modo tale
che sia possibile in un ciclo passare in rassegna tutte le coppie di
stringhe contenute nel JSON. Mi potete aiutare o dare qualche indizio?
Grazie
Arrivano da una chiamata REST fatta tramite JavaScript (Delphi Relax).
Io JSON non lo digerisco ... array o oggetti per me, pari sono.
In pratica, in una pagina di scelta delle opzioni disponibili per un
determinato prodotto, uso un oggetto JSON per far conoscere alla mia
applicazione Delphi, quali sono le opzioni che il cliente ha scelto.
Quindi il JSON che avevo, prima di introdurre le opzioni, conteneva
l'id del prodotto ed altre informazioni necessarie alla determinazione
del prezzo. Questa la sua dichiarazione in Javascript:
pcb = {productid: null, widthmm: null, heightmm: null, productiondays:
null, quantity: null, filename: null, customer_code: null,
customer_note: null};
Poi, introducendo attributi e opzioni, è sorta l'esigenza di tenere
traccia delle opzioni scelte dal cliente per ogni attributo, quindi ho
pensato, avendo a disposizione un solo oggetto JSON per la chiamata
REST, di aggiungere all'oggetto una lista di coppie Attributo<-
>Opzione ed ho dichiarato pcb in questo modo:
pcb = {productid: null, widthmm: null, heightmm: null, productiondays:
null, quantity: null, filename: null, customer_code: null,
customer_note: null, attributes: {}};
Quando questo JSON arriva a Delphi, faccio:
SelectedAttributesJSON := TJSONObject.Create;
SelectedAttributesJSON.AddPair('attributes',
jObject.Get('attributes').JsonValue);
Ok la stringlist con uso di coppie nome valore (usando il simbolo
'='), ma mi sono un po' arenato perchè non so come scorrere tutti gli
elementi di questo oggetto JSON ...
Non sempre sono disponibili tutti gli attributi per tutti i prodotti,
e quindi dell'attributo con id=1 il cliente
> Non sempre sono disponibili tutti gli attributi per tutti i prodotti,
> e quindi dell'attributo con id=1 il cliente
Ti si � troncato il messaggio?
Concordo con tutta l'implementazione.
Il problema resta quello di usare delle classi wrapper che ti permettono
di attraversare la struttura.
Nei link che ti ho fornito trovi le classi da usare per fare questo.
BTW, i link sono stati ricavati dal sito stesso di json, quindi presumo
che siano attendibili.
Grazie, gli sto dando un'occhiata per vedere come funzionano. Appena
ho fatto posto le righe di codice per scorrere l'oggetto ...
Hai dato un'occhiata qui?
http://docwiki.embarcadero.com/RADStudio/en/JSON
Osserva anche il codice sorgente della libreria VCL per una
dichiarazione completa dei membri disponibili.
Ciao,
Il secondo errore è che la stringlist viene costruita con coppie Nome/
Nome anzichè Nome/Valore.
Il codice corretto è il seguente:
var
i: Integer;
attrObject: TJSONObject;
AttributeList: TStringList;
begin
[...]
AttributeList := TStringList.Create;
if jObject.Get('attributes').JsonValue is TJSONObject then
begin
attrObject := TJSONObject(jObject.Get('attributes').JsonValue);
for I := 0 to attrObject.Size - 1 do
AttributeList.Add(attrObject.Get(I).JsonString.Value + '=' +
attrObject.Get(I).JsonValue.Value);
end;
[...]