Hallo,
Ich habe eine Online-Anwendung, bei der ich Datenextraktionen anfordern kann, indem ich eine HTTP-Anfrage mit den entsprechenden JSON-Feldern sende.
Ein Feld (Feld2) in meiner JSON-Nutzlast ist ein Listentyp und kann ein oder mehrere Elemente enthalten. Das Problem, mit dem ich konfrontiert bin, ist, dass mein JMP-Skript nur funktioniert, wenn diese Liste ein einzelnes Element enthält und nicht, wenn es zwei oder mehr enthält.
Der Fehler, den ich erhalte, ist:
"error":"com.google.gson.stream.MalformedJsonException: Unterminated string
Was mich verwirrt ist, dass wenn ich dieselbe HTTP-Anfrage mit derselben JSON-Nutzlast unter Verwendung der Anforderungsbibliothek von Python mache, die Anfrage ohne Probleme durchläuft.
Es scheint, dass dies möglicherweise damit zu tun hat, wie JMP den JSON formatiert, bevor die Anforderung gesendet wird.
Irgendwelche Ideen?
Unten finden Sie eine vereinfachte Version meines Codes als Referenz.
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">
Da ich die Werte, die Sie in value1, value2a, value2b, value3 verwenden, nicht kenne, kann ich nicht definitiv sagen, wo das Problem liegt. Einige Zeichen in JSON müssen maskiert werden (z. B. \ n, \ t, ", 'usw.).
Wenn möglich, können Sie verwenden:
Write(payloadJSON || "\!n");
Nachdem Sie alle Werte für payloadJSON verkettet haben und prüfen, ob gültiges JSON durch Kopieren / Einfügen in einen JSON-Parser wie das JSON Editor Online-Plugin von Chrome erstellt wurde.
Sofern es nicht sehr einfach ist, verwende ich normalerweise JSL Associative Arrays und AsJSONExpr, um den JSON zu bilden. Es macht die Flucht für mich. (Die JSON-Nachricht nimmt auch ein assoziatives Array an.)
In Ihrem Fall (der, der nicht funktioniert) würde ich es so schreiben, um sicherzustellen, dass alle Angebote für JSON verarbeitet werden
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");