It is currently 4 April 2020, 14:12 Advanced search

[RISOLTO] Creare array di 1 solo oggetto in JSON

Domande e risposte su come utilizzare Instant Developer Foundation al meglio

[RISOLTO] Creare array di 1 solo oggetto in JSON

Postby nradogna » 23 March 2020, 17:30

Ciao, vorrei creare un array JSON contenente anche un solo elemento.
Mi spiego meglio, partendo da un oggetto XMLNode jsonArray = null, riesco a creare un array JSON attraverso un ciclo:
Code: Select all
for each IMPIANTO impianto in collectionImpianti {
   jsonArray = jsonIniziale.addElement("impianti")
   jsonArray.setAttribute("campo1",..)
   jsonArray.setAttribute("campo2",..)
}

In questo modo riesco ad ottenere, nel caso di 2 o più risultati, un array
Code: Select all
"impianti" : [ { "campo1" : .. , "campo2" : ..} , { "campo1" : .. , "campo2" : ..} ... ]

Ma nel caso di 1 solo risultato, ottengo
Code: Select all
"impianti" : { "campo1" : .. , "campo2" : .. }

Io ho bisogno sempre di un array, purtroppo mi interfaccio con un web service ben definito (impossibile da modificare).
C'è un workaround?
Grazie
Last edited by nradogna on 24 March 2020, 12:05, edited 1 time in total.
nradogna
 
Posts: 32
Joined: 20 March 2018, 9:52

Re: Creare array di 1 solo oggetto in JSON

Postby lucabaldini » 23 March 2020, 17:38

Non saprei, dovrei controllare..
Ti chiedo una cosa: che versione di InDe stai utilizzando?

Se devi creare un JSON potresti usare direttamente la libreria JSON... con quella dovresti avere meno problemi... è nata proprio per risolvere tutti i problemi derivanti dalla conversione di XML->JSON
User avatar
lucabaldini
Pro Gamma
Pro Gamma
 
Posts: 4052
Joined: 1 October 2010, 17:03
Location: Bologna

Re: Creare array di 1 solo oggetto in JSON

Postby lucabaldini » 23 March 2020, 17:38

User avatar
lucabaldini
Pro Gamma
Pro Gamma
 
Posts: 4052
Joined: 1 October 2010, 17:03
Location: Bologna

Re: Creare array di 1 solo oggetto in JSON

Postby nradogna » 24 March 2020, 9:02

Ciao Luca, utilizzo la 19.5.
Ho guardato la documentazione provando a buttar giù due righe di codiec. Da quel che ho capito basta instanziare un IDARRAY (nel mio caso) ed assegnargli un oggetto (addObject):
Code: Select all
IDArray ida = new()
for each(...) {
IMPIANTO impianto = new()
impianto.PROPR1 = valore
impianto.PROPR2 = valore
int index = ida.addObject(impianto)
}

Fuori dal ciclo trasformo il contenuto dell'IDArray in stringa (per vedere cosa effettivamente c'è dentro):
Code: Select all
string test = JSON.stringify(ida)

Da quel che vedo dal debug ottento un array vuoto "[[null]]"
Eppure dagli esempi del manuale il funzionamento mi sembra questo. Sto provando a fare delle prove, tu avresti qualche dritta da darmi?
nradogna
 
Posts: 32
Joined: 20 March 2018, 9:52

Re: Creare array di 1 solo oggetto in JSON

Postby lucabaldini » 24 March 2020, 9:53

la libreria JSON permette la serializzazione solo di oggetti nativi (stringhe, numeri, float, date), IDArray e IDMap... non qualunque tipo di oggetto.

Quindi il tuo IMPIANTO non puoi metterlo nell'array direttamente... devi usare un IDMap e copiare dentro la mappa i valori delle proprietà che vuoi serializzare in JSON...

Qualcosa del genere:
Code: Select all
  IDMap idm = new()
  idm.setValue("PROP1", 1)
  idm.setValue("PROP2", "a")
  idm.setValue("PROP3", null)
  //
  IDArray ida = new()
  ida.addObject(idm)
   
  string s = JSON.stringify(ida)


Così facendo s contiene
Code: Select all
  [{"PROP1":1,"PROP2":"a","PROP3":null}]
User avatar
lucabaldini
Pro Gamma
Pro Gamma
 
Posts: 4052
Joined: 1 October 2010, 17:03
Location: Bologna

Re: Creare array di 1 solo oggetto in JSON

Postby lucabaldini » 24 March 2020, 9:55

Il fatto che classi generiche diventino null è scritto nelle note della JSON.stringify:

I valori contenuti nell'oggetto diversi da IDMap, IDArray o valori primitivi (stringhe, numeri, etc.) vengono convertiti in null.

:-))

Qui l'articolo della doc: https://doc.instantdeveloper.com/?ARTID=90C4BA28-B782-4FA9-8D62-8B7304B06CC2&LANG=it
User avatar
lucabaldini
Pro Gamma
Pro Gamma
 
Posts: 4052
Joined: 1 October 2010, 17:03
Location: Bologna

Re: Creare array di 1 solo oggetto in JSON

Postby nradogna » 24 March 2020, 12:05

Grazie, funziona!
Con questa libreria riesco ad implementare facilmente la gestione del mio JSON, pur essendo quest'ultimo molto complesso da strutturare!
Purtroppo ignoravo totalmente l'esistenza di questa libreria. Nonostante abbia svolto una sessione di assistenza dedicata proprio ai metodi per trattare i JSON, la libreria non mi è stata presentata, siamo dovuti ricorrere a metodi più macchinosi utilizzando XMLDocument e XMLNode (con conseguenti problemi legati ad array, booleani e json annidati).
Grazie ancora!
nradogna
 
Posts: 32
Joined: 20 March 2018, 9:52

Re: [RISOLTO] Creare array di 1 solo oggetto in JSON

Postby lucabaldini » 24 March 2020, 13:15

Prego! :-)

Stiamo valutando anche la possibiltià di poter usare direttamente le classi (come avevi fatto tu poco sotto)... prima o poi facciamo anche quello... così non devi passare da istanze di IDMap per descrievere un oggetto Javascript. :-)
User avatar
lucabaldini
Pro Gamma
Pro Gamma
 
Posts: 4052
Joined: 1 October 2010, 17:03
Location: Bologna


Return to Tips & Tricks - Foundation

Who is online

Users browsing this forum: No registered users and 18 guests

cron