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.).
Die zwei JSON-Strings unmarshalieren, das Ergebnis zur Karte hinzufügen und die Karte serialisieren. –
Sie setzen ein JSON-Dokument in ein anderes (als Text). Kombinieren Sie sie zu einem einzigen Dokument. – ThomasRS