2017-04-16 2 views
1

Ich habe eine Java-Karte wie folgt aus:Gson ist Schrägstriche meine JSON-Strings Hinzufügen

HashMap<String, String> map = new HashMap<String, String>(); 
map.put("someKey", jsonStringVariable); 
map.put("someOtherKey", jsonStringVariable2); 

wo jsonStringVariable und jsonStringvariable2 sind Strings mit gültiger JSON.

Letztlich mag ich Gson verwenden, um die gesamte Karte eines einziges JSON-String zu machen, zur Zeit es wie folgt tun:

Gson gson = new Gson(); 
String json = gson.toJson(map); 

Doch jetzt json hat viele Schrägstriche zu den ursprünglichen JSON-Strings hinzugefügt die Karte. Wie kann ich verhindern, dass Gson Schrägstriche zu meinen ursprünglichen JSON-Variablen hinzufügt und sie einfach als JSON behält?

+0

Die zwei JSON-Strings unmarshalieren, das Ergebnis zur Karte hinzufügen und die Karte serialisieren. –

+1

Sie setzen ein JSON-Dokument in ein anderes (als Text). Kombinieren Sie sie zu einem einzigen Dokument. – ThomasRS

Antwort

0

fand ich eine Lösung, die mich funktioniert, indem man zuerst auf ein Objekt die JSON-String konvertieren, dann später wieder in einen String konvertiert:

HashMap<String, Object> map = new HashMap<String, Object>(); 
map.put("someKey", gson.fromJson(jsonStringVariable, Object.class); 
map.put("someOtherKey", gson.fromJson(jsonStringVariable2, Object.class); 

Ich bin mir nicht sicher, ob dies ist effizient, aber Am wenigsten funktioniert es jetzt. Wenn jemand eine effizientere Methode kennt, lass es mich wissen!

+0

Ja, dass ich auch versucht habe .. funktioniert gut. am ende musst du das objekt an Gson eher die String liefern. –

0

Dies ist, weil Strings codiert werden müssen und ordnungsgemäß entkam, wo notwendig, um das Ergebnis JSON-Dokument syntaktisch korrekt zu halten.

Ich bin mir nicht sicher, ob das effizient ist, aber zumindest für den Moment funktioniert es. Wenn jemand eine effizientere Methode kennt, lass es mich wissen!

Die Schwachpunkte Ihrer gson.fromJson -basierte Lösung kann:

  • ... relativ nicht sehr billig selbst (sucht eine Art Adapter auf, Java Reflexion, usw.);
  • ... nehmen Sie nicht einen unerwarteten Typ Adapter hinter den Kulissen auf, wenn Sie alles wie Object.class behandeln;
  • ... verbrauchen (viel) mehr Speicher, um deserialisierte Werte zu speichern, die nur zurückgeschrieben werden sollen;
  • ... gibt Ausgabe-JSON-Darstellungen zurück, die nicht mit den Eingabe-JSON-Darstellungen übereinstimmen.

Sie könnten, was JsonWriter in einem solchen Fall verwenden:

final Writer writer = new StringWriter(); 
// ... 
try (final JsonWriter jsonWriter = new JsonWriter(writer)) { 
    jsonWriter.beginObject(); 
    jsonWriter.name("someKey"); 
    jsonWriter.jsonValue(someValue); 
    jsonWriter.name("someOtherKey"); 
    jsonWriter.jsonValue(someOtherValue); 
    jsonWriter.endObject(); 
} 
// ... 
return writer.toString(); 

Beachten Sie, dass Sie nicht unbedingt haben StringWriter verwenden: Sie können „umleiten“, um die kombinierte Ausgabe zu jeder Writer Instanz. mit ihm so wie, dass Sie bekommen:

  • nicht Gson überhaupt verwendet wird;
  • Definition der JSON-Struktur unabhängig Gson Instanzkonfiguration;
  • Minimaler Speicherverbrauch;
  • stellen Sie sicher, dass die Werte unverändert geschrieben werden.

Zum Beispiel, wenn Sie someValue und someOtherValue wie diese haben:

[ 
    "foo", "bar" 
] 
{ 
    "foo": 1, 
    "bar": 2 
} 

der Ausgang wird wie folgt dar:

{"someKey":[ 
    "foo", "bar" 
] 
,"someOtherKey":{ 
    "foo": 1, 
    "bar": 2 
} 
} 

Wenn Sie die Werte normalisiert werden (ohne Whitespaces, neue Zeilen, etc), müssen Sie nur jeden JSON-Wert über JsonReader lesen und einfach delegieren eingehende Ergebnisse an die JsonWriter Instanz reflektiv (bekam BEGIN_OBJECT? - schreibe mit .beginObject, usw.).

Verwandte Themen