Errore di stringa non terminata JSON durante l'invio della richiesta HTTPCiao,
Ho un'applicazione online da cui posso richiedere estrazioni di dati inviando una richiesta HTTP con i campi JSON appropriati.
Un campo (field2) all'interno del mio payload JSON è un tipo di elenco e può contenere uno o più elementi. Il problema che sto affrontando è che il mio script JMP funziona solo se questo elenco ha un singolo elemento e non se ne ha due o più.
L'errore che ricevo è:
"error":"com.google.gson.stream.MalformedJsonException: Unterminated string
Ciò che mi confonde è che se faccio la stessa richiesta HTTP con lo stesso payload JSON utilizzando la libreria di richieste di Python, la richiesta viene eseguita senza problemi.
Sembra che potrebbe avere a che fare con il modo in cui JMP sta formattando il JSON prima che invii la richiesta.
Qualche idea?
Di seguito è riportata una versione semplificata del mio codice per riferimento.
url = "http://www.example_url.com/request";
my_username = "username";
timeout_minutes = 2;
var_field1 = "\!"value1\!"";<BR />
<FONT color="#FF0000"><STRONG><FONT color="#339966">var_field2 = "\!"value2a\!""; //works<BR /><BR /></FONT>//var_field2 = "\!"value2a\!", \!"value2b\!""; //does not work<BR /></STRONG></FONT>
var_field3 = "\!"value3\!"";
payloadJSON = "{\!"test\!":{\!"field1\!":" || var_field1 || ",\!"field2\!":[" || var_field2 || "],\!"field3\!":[" || var_field3 || "]}}";
request = New HTTP Request(
URL( url ),
Method( "POST" ),
Timeout(timeout_minutes*60),
Headers
(
{
"header_field1": "header_value1",
"header_field2": "header_value2"
}
),
Username(my_username),
JSON(payloadJSON)
);
data = request << Send();</CODE></P><P><CODE class=" language-jsl">
Ri: Errore stringa non terminata JSON durante l'invio della richiesta HTTPNon conoscendo i valori che stai usando in value1, value2a, value2b, value3, non posso dire definitivamente quale sia il problema. Alcuni caratteri in JSON devono essere sottoposti a escape (come \ n, \ t, ", 'e così via).
Se possibile, puoi usare:
Write(payloadJSON || "\!n");
dopo aver concatenato tutti i valori per payloadJSON e vedere se JSON valido viene prodotto copiando / incollando in un parser JSON come il plugin JSON Editor Online di Chrome.
A meno che non sia un JSON molto semplice, in genere utilizzo gli array associativi JSL e utilizzo AsJSONExpr per formare il JSON. Fa la fuga per me. (Il messaggio JSON prenderà anche un array associativo)
Nel tuo caso (quello che non funziona) lo scriverei in questo modo per assicurarmi che tutte le citazioni siano gestite per JSON
var_field1 = "\!"value1\!"";
var_field2 = {"\!"value2a\!", \!"value2b\!""};
var_field3 = "\!"value3\!"";
fields = [=>];
fields["field1"] = var_field1;
fields["field2"] = var_field2;
fields["field3"] = var_field3;
payloadJSON = [=>];
payloadJSON["test"] = fields;
payloadJSON = asJSONExpr(payloadJSON);
Write(payloadJSON || "\!n");