Italian java.lang.RuntimeException: JSON Array expected.

MARCO C.

Active Member
Licensed User

Scusa il ritardo , ma ero fuori sede 2 gg.
Intanto grazie per la tua disponibilità :

ti riporto di seguito il codice che richiama la query
B4X:
Sub FetchCountriesList

    Dim fSql As String
    ProgressDialogShow("Fetching lista service")
    
    Log(" FetchCountriesList 218")
    
    lblTmp.text ="Elenco per data"
    
    
        fSql=" SELECT idcall, datacall, app_service.idcli, ragsociale , datasched, idserv, idagente, noterichiesta ,flagclose, flagtodo  "
        fSql=fSql & " FROM app_service INNER JOIN app_clienti on app_service.idcli = app_clienti.codice "
        fSql=fSql & " WHERE flagclose ='0' AND idserv ='1' AND flagtodo ='0' ORDER BY datacall, idcli "
           
    ExecuteRemoteQuery(fSql, service_list)
    
    ToastMessageShow("...carico lista",False)
    Log("FetchCountriesList-----")
    
End Sub

Fsql contiene questa query :

SELECT idcall, datacall, app_service.idcli, ragsociale , datasched, idserv, idagente, noterichiesta ,flagclose, flagtodo FROM app_service INNER JOIN app_clienti on app_service.idcli = app_clienti.codice WHERE flagclose ='0' AND idserv ='1' AND flagtodo ='0' ORDER BY datacall, idcli

richiesta al server da questo codice

B4X:
Sub ExecuteRemoteQuery(Query As String, JobName As String)
    
    Log(" ExecuteRemoteQuery line 342")
    Dim job As HttpJob
    job.Initialize(JobName, Me)
    job.PostString("https://appmacro.netsons.org/app/connessione.php", Query)
End Sub

Grazie
 

drgottjr

Expert
Licensed User
Longtime User
il progetto + 2 screen caps
 

Attachments

  • 2.png
    281.8 KB · Views: 220
  • cap.png
    409.4 KB · Views: 219
  • marco.zip
    8.7 KB · Views: 235

Sagenut

Expert
Licensed User
Longtime User
[OT]
Voglio fare i miei Complimenti a @drgottjr per l'impegno che mette nell'aiutare su un problema scrivendo in Italiano. Sei Spagnolo?

I want to Congratulate with @drgottjr for his effort to help on a problem writing in Italian.
Are you Spanish?
[/OT]
 

drgottjr

Expert
Licensed User
Longtime User
nè nè ... ma parlo spagnolo e mi piace esercitarmi un po' in italiano quando la causa è buona. 41,-71
 

drgottjr

Expert
Licensed User
Longtime User

drgottjr

Expert
Licensed User
Longtime User
maledetto! non così grande sono; lo ho dimenticato:

B4X:
    Wait For (wjob) JobDone(wjob As HttpJob)
    If wjob.Success Then
        Dim text As String = wjob.GetString
'        Msgbox(text, "FYI:")

        wjob.release   ' <<<<<<<<<<<<<<< si elemina un archivio provissorio "invisibile"

si deve cancellare un archivio provissorio. la risposta del server è mantenuta in questo archivio (si deve guardar nella classe okhttputils2 per vederlo). altrimente, sono accumulati: temp1, temp2, temp3, ecc. wjob si da un numero contatore chi ascende. se si cancella l'archivio, il contatore ricomincia.
si cancella l'archivio quando la risposta è ben ricevuta.
 

MARCO C.

Active Member
Licensed User

Chiaro
Tu lo gestisci ad inizio ciclo... qualcuno lo inserisce a fine lettura/ ciclo .
Grazie ancora
 

Sagenut

Expert
Licensed User
Longtime User
Anche se non ho ancora lavorato con HttpJob mi pare di aver letto più volte che il Job.Release sia fondamentale dopo che il download ha avuto successo per liberare la memoria occupata da quel determinato flusso.
Un pò come il Close dopo aver usato uno Stream.
Del resto non ha senso lasciare in sospeso qualcosa che ha già fatto quel che doveva fare.
 

drgottjr

Expert
Licensed User
Longtime User
per me, wjob.successo vuo dire download terminato. (come sarebbe altirmente?) wjob.release e una altra cosa, una cosa interna di httputils per, come dice sagenut, liberare la memoria del archivio provissorio. "close" fa parte del flusso. "release" vuo dire lasciare, liberare (ad es, rifiueti).
se vuoi fare wjob.release al finale, va bene.
 

drgottjr

Expert
Licensed User
Longtime User
jobdone non si lancia se tutto se il flusso non fosse completo, se leggo bene il codice di httputils...
 

MARCO C.

Active Member
Licensed User
il progetto + 2 screen caps

i tuo esempio funziona alla grande, ma ora un dubbio :
ha senso effettuare questi controlli


se il mio comando è un "INSERT INTO" ... anziché una classica richiesta dati ?

( vedi sotto sequenza controlli che mi ha consigliato )
B4X:
Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    'Activity.LoadLayout("Layout1")
 
 
    Dim query As String = "SELECT idcall, datacall, app_service.idcli, ragsociale , datasched, idserv, idagente, noterichiesta ,flagclose, flagtodo FROM app_service INNER JOIN app_clienti on app_service.idcli = app_clienti.codice WHERE flagclose ='0' AND idserv ='1' AND flagtodo ='0' ORDER BY datacall, idcli"
    Dim wjob As HttpJob
    wjob.Initialize("",Me)
    wjob.PostString("https://appmacro.netsons.org/app/connessione.php", query)
    Wait For (wjob) JobDone(wjob As HttpJob)
    If wjob.Success Then
        Dim text As String = wjob.GetString
          
        Dim json As JSONParser
        Try
            json.Initialize( text )
        Catch
            ToastMessageShow("Text: Could not initialize json...", False)
            Return
        End Try
    
        Dim list As List
        Try
            list = json.NextArray
        Catch
            Log(LastException)
            ToastMessageShow("List: Error with json array: " & LastException.Message, "true")
            Return
        End Try
        '.... codice
        
        '       ... codice
    Else
        Msgbox("error: " & LastException.Message, "Uh oh")
    End If
 
    wjob.Release
 
End Sub

Grazie
 
Last edited:

drgottjr

Expert
Licensed User
Longtime User
una richiesta prevede un json array.
inserire prevede un OK o qualcosa di simile. ossia testo.
ma il servir probabilmente risponderà con json, un oggetto json,
no un array.

fai una prova con wjob.getString per vedere esattamente qual'e
la risposta. {"answer":"ok"} e un oggetto json.

ho detto fa molto tempo che potresti avere 2 oppure 3 jobs:
uno che prevede array, altro che prevede un'oggetto, e uno che
prevede un testo semplice. dai un nome distinto ai jobs:
dopo cherchi el wjob.name

B4X:
    If wjob.Success Then
        Dim text As String = wjob.GetString
           
        Dim json As JSONParser
        Try
            json.Initialize( text )
        Catch
            ToastMessageShow("Text: Could not initialize json...", False)
            Return
        End Try

        select wjob.name
            case "richesta"
                    Dim list As List
                    Try
                       list = json.NextArray
                     ....

            case "inserire"
                     log("risposta: " & text)

                  OPPURE  (secondo il tipo di risposta ...)
                    Dim jmap As map
                    Try
                       jmap = json.NextObject
                     ....
        end select

per un "inserire", io no so come sara la risposta. presumo json.
fai una prova e guarda la risposta. lo faro io sta sera.
vediamo se riesci a farlo prima
 

MARCO C.

Active Member
Licensed User

Questa la risposta sulla variabile TEXT

<br />
<b>Warning</b>: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in <b>/web/htdocs/www.miosito.it/home/file/connessionearuba.php</b> on line <b>21</b><br />
[]<br />
<b>Warning</b>: mysqli_free_result() expects parameter 1 to be mysqli_result, boolean given in <b>/web/htdocs/www.miosito.it/home/file/connessionearuba.php</b> on line <b>26</b><br />

dove alla mia richiesta
INSERT INTO `tabella` (`id`, `idcall`, `item`, `qt`, `prz`, `noterow`) VALUES (NULL, '140', '01810711', '1', ' 4.650', '')

sul file php corrisponde a

while($r = mysqli_fetch_assoc($sth))
e
mysqli_free_result($sth);

B4X:
<?php

$databasehost = "xx.xx.xx.xx....";
$databasename = "dbname";
$databaseusername ="user";
$databasepassword = "password";

$con = mysqli_connect($databasehost,$databaseusername,$databasepassword, $databasename) or die(mysqli_error($con));
mysqli_set_charset ($con , "utf8");
$query = file_get_contents("php://input");
$sth = mysqli_query($con, $query);

if (mysqli_errno($con)) {
   header("HTTP/1.1 500 Internal Server Error");
   echo $query.'\n';
   echo mysqli_error($con);
}
else
{
   $rows = array();
   while($r = mysqli_fetch_assoc($sth)) {
     $rows[] = $r;
   }
   $res = json_encode($rows);
    echo $res;
    mysqli_free_result($sth);
}
mysqli_close($con);
?>
 

drgottjr

Expert
Licensed User
Longtime User
la richiesta e sbagliata. hai mai fatto un "insert"? come era la risposta? il codice che hai messo non ha niente a che fare con un "insert"; e la risposta a un "select". per il momento non posso dirte quello che non va. lo provaro fra poco. l'errore dice che il server aspettava certa cosa, ma tu gli hai dato altra cosa... questo è il motivo per cui si deve usare sempre "try". sicuro che la richiestra e buona? corretta? guardala attentamente
 

MARCO C.

Active Member
Licensed User


controllo nuovamente , ma nel db mi trovo l'inserimento della riga post comando INSERT INTO ..
Grazie
 

drgottjr

Expert
Licensed User
Longtime User
capisco le parole, ma non il significato. devo domandarte di nuovo: hai mai fatto un insert con successo? e cual'era la risposta? ci sono aspetti della richiesta che hai fatto che non mi sembrano giuste. qual'e il formato del "table"? c'e documentazione che posso legere? (documentazione sul server, non su mysql, voglio dire.)
non si deve fare una richiesta ad un server senza sapere come sara la risposta. non e possibile fare una app senza sapere. riprova
 

MARCO C.

Active Member
Licensed User

hai mai fatto un insert con successo? SI

qual'era la risposta?
<br />
<b>Warning</b>: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in b>/web/htdocs/www.miosito.it/home/file/connessionearuba.php</b> on line <b>21</b><br />
[]<br />
<b>Warning</b>: mysqli_free_result() expects parameter 1 to be mysqli_result, boolean given in <b>/web/htdocs/www.miosito.it/home/file/connessionearuba.php</b> on line <b>26</b><br />
 
Cookies are required to use this site. You must accept them to continue using the site. Learn more…