2013-05-15 10 views
23

Ich muss ein Datum in JSON senden. Das Datum Zeichenfolge sollte wie folgt aussehen:JSONObject.toString: wie NICHT Schrägstriche zu entkommen

"2013.05.15"

Stattdessen JSONObject.toString entkommt es wie folgt:

"2013 \/5 \/15"

ich verstehe, dass diese json Strings innerhalb Skripte Tags zu ermöglichen gemacht wird, wie diese Frage erklärt: JSON: why are forward slashes escaped?

Aber in meinem Fall brauche ich es nicht. Tatsächlich gibt der Server einen Fehler zurück. Der Server hat damit nichts zu tun, und ich kann den Server nicht reparieren, daher muss ich ihn im Code des mobilen Clients reparieren.

Ich könnte eine String.replace nach Serialisierung tun, aber was, wenn ich eigentlich wollte die "\ /" Zeichenfolge in einem anderen Teil des JSON enthalten?

Gibt es eine Möglichkeit, ein JSON-Objekt zu serialisieren, ohne Schrägstriche zu umgehen? (Wenn möglich, ohne etwas zu entgehen)

Vielen Dank im Voraus.

Antwort

6

Endlich habe ich mich für den schnellen und schmutzigen Trick entschieden, die maskierten Schrägstriche in der serialisierten Zeichenfolge zu ersetzen, bevor sie an den Server gesendet werden. Zum Glück, JSONObject entkommt auch Backslashes, also muss ich sie auch entpacken. Nun, wenn ich "\ /" absichtlich senden wollte, wäre die Escape-Zeichenfolge "\\ /" und das Ergebnis des Ersetzens ist die ursprüngliche Zeichenfolge wie beabsichtigt.

+0

Es ist sehr merkwürdig, wie das immer noch geschieht !! Anywho, habe ich eine Zeichenfolge ersetzen auf der JSON-Zeichenfolge und die resultierende Zeichenfolge und übergab das an die StringEntity. Es funktionierte wie Magie. Danke und Prost !! – Migisha

2

Dieses Verhalten ist fest in JSONStringer.java codiert, siehe Methode private void string(String value), Zeile 302+.

Es sollte möglich sein, die Klasse JSONStringer zu kopieren und eine eigene Version von value(Object) (Zeile 227+) zu implementieren. Implementieren Sie dann Ihre eigene Version von JSONObject .toString() in einer Dienstprogrammklasse und verwenden Sie Ihren eigenen JSONStringer anstelle des Originals.

BEARBEITEN: Das Unterklassifizieren von JSONStringer wird nicht einfach sein, da value() eine private Methode beforeValue() aufruft, auf die nicht zugegriffen werden kann.

+1

Vielleicht wird auch eine andere JSON-Bibliothek tun, was Sie wollen, siehe zum Beispiel [google-gson] (http://code.google.com/p/google-gson/). – devconsole

+0

Sie haben Recht. Die 'JsonWriter.setHtmlSafe' Methode scheint genau das zu tun. Die Standardeinstellung ist false. Ich nehme an, dass diese Bibliothek ungespannte JSON-Zeichenfolgen erzeugt.Ich habe nicht die Zeit, es zu testen, aber wenn du es tust, würde ich das als Lösung akzeptieren :) –

0
jsonObjSend.toString().replace("\\\\","") 

Arbeitete für mich. Ein bisschen schmutziger Trick, aber scheint keine andere Lösung.

+3

'jsonObjSend.toString(). Replace (" \\ "," ")' funktionierte nicht für mich, aber 'jsonObjSend.toString(). Replace (" \\\\ "," ")' hat funktioniert. Was kann der Grund sein? –

0

Ich hatte ein ähnliches Problem mit JSONObject "Put" beim Umgang mit Daten für ein Bild, das in einem adat Uri "Daten codiert wurde: image/png; base64, .....". Die Put-Funktion würde einen weiteren Schrägstrich hinzufügen, um das Format in "Daten: image/png; base64, ....." zu ändern. Es scheint, dass die Ursache des Problems eine Zeichenfolgenwertprüfung innerhalb der JSONObject "put" -Funktion ist, die die zusätzlichen Schrägstriche hinzufügt. Man könnte vielleicht die Funktion überladen oder die Klasse erweitern, aber ich fand den einfachsten Weg, eine eindeutige Zeichenfolge wie guid hinzuzufügen und dann diese GUID durch die Uri-Zeichenfolge nach dem Aufruf der toString() -Funktion Ihres JSONObject zu ersetzen.

JSONObject userJson = new JSONObject(); 
String myimageUri = "data:image/png;base64,XXXDATAXXX"; 
userJson.put("imageUri", "b0c8f13d-48b1-46b4-af28-4e2d8004a6f8"); 
userJson.toString().replace("b0c8f13d-48b1-46b4-af28-4e2d8004a6f8", myimageUri);