GSON有兩個獨立的API(可以合併):一個用於序列化和反序列化,另一個用於流式傳輸。如果要處理JSON流沒有內存開銷或使用動態結構(而不是靜態的POJO),你可以這樣做:
- 創建JsonWriter(在我的例子中,我使用的StringWriter);
- 創建一個JsonReader;
- 做一個循環,從讀者消費事件,並將其反饋給作家,有可能更改,添加,刪除等
循環將包括一個switch語句中必須有一個情況下,所有的可能的事件(其中10個)。即使最簡單的例子也必須包含所有這些,所以下面的代碼看起來很冗長。但擴展很容易,進一步的擴展不會讓時間更長。
該追加「測試」的一個例子:1對每個對象看起來像:
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());
}
}
如何將JSON轉換爲Map? – linuxeasy