GSON 有两个独立的 API(可以组合):一个用于序列化和反序列化,另一个用于流式传输。如果您想在没有内存开销或使用动态结构(而不是静态 POJO)的情况下处理 JSON 流,您可以执行以下操作:
- 创建一个 JsonWriter(在我的示例中,我使用 StringWriter);
- 创建一个 JsonReader;
- 创建一个循环,消耗来自阅读器的事件并将它们提供给编写器,可能会进行更改、添加、省略等。
循环将包含一个 switch 语句,该语句必须包含所有可能的事件(其中 10 个)。即使是最简单的示例也必须包含所有这些,因此下面的代码看起来相当冗长。但是它很容易扩展,进一步的扩展不会让它变得更长。
将 "test": 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());
}
}