GSON ha due API separate (che possono essere combinate): una è utilizzata per la serializzazione e la deserializzazione e l'altra per lo streaming. Se si desidera elaborare flussi di JSON, senza sovraccarico di memoria o utilizzando strutture dinamiche (piuttosto che POJO statiche) si può fare qualcosa di simile:
- creare un JsonWriter (nel mio esempio io uso StringWriter);
- creare un JsonReader;
- fare un ciclo che consuma eventi dal lettore e li invia allo scrittore, eventualmente apportando modifiche, aggiunte, omissioni ecc
Il ciclo sarà composto da una singola istruzione switch che deve avere un caso tutto il possibili eventi (10 di loro). Anche l'esempio più semplice deve averli tutti, quindi il codice sotto sembra piuttosto prolisso. Ma è molto facile estenderlo e ulteriori estensioni non lo faranno molto più a lungo.
Un esempio che aggiunge "test": 1 paio di ogni oggetto sembra qualcosa di simile:
public class Whatever {
static void streamandmodify(JsonReader reader, JsonWriter writer) throws IOException {
while (true) {
JsonToken token = reader.peek();
switch (token) {
// most cases are just consume the event
// and pass an identical one to the writer
case BEGIN_ARRAY:
reader.beginArray();
writer.beginArray();
break;
case END_ARRAY:
reader.endArray();
writer.endArray();
break;
case BEGIN_OBJECT:
reader.beginObject();
writer.beginObject();
// this is where the change happens:
writer.name("test");
writer.value(1);
break;
case END_OBJECT:
reader.endObject();
writer.endObject();
break;
case NAME:
String name = reader.nextName();
writer.name(name);
break;
case STRING:
String s = reader.nextString();
writer.value(s);
break;
case NUMBER:
String n = reader.nextString();
writer.value(new BigDecimal(n));
break;
case BOOLEAN:
boolean b = reader.nextBoolean();
writer.value(b);
break;
case NULL:
reader.nextNull();
writer.nullValue();
break;
case END_DOCUMENT:
return;
}
}
}
public static void main(String[] args) throws IOException {
// just for test:
JsonReader jr = new JsonReader(new StringReader("{\"a\":1, \"b\":{\"c\":[1,2,3,{},{}]}}"));
StringWriter sw = new StringWriter();
JsonWriter jw = new JsonWriter(sw);
streamandmodify(jr, jw);
System.out.println(sw.getBuffer().toString());
}
}
Come convertiresti JSON in Mappa? – linuxeasy