使用jackson按流模式读写JSON文件。
对于超大文件,此方式不会导致内存溢出,可以方便的进行解析、修改。
// 使用jackson按流模式读写JSON文件
// 例子演示的是读取后,直接写出。可以格式化前后两个JSON文件,然后通过文本方式比较,文档应该完全一致
// 如果需要修改数据,那么修改调用generator.wirteXXX的地方
public static void readAndWriteWithStreamMode(String file) throws IOException {
InputStream fin = new FileInputStream(file);
InputStreamReader fr = new InputStreamReader(fin, "utf-8");
JsonFactory jasonFactory = new JsonFactory();
FileOutputStream fout2 = new FileOutputStream(file + ".json");
OutputStreamWriter fw2 = new OutputStreamWriter(fout2, "utf-8");
JsonGenerator generator = jasonFactory.createGenerator(fw2);
JsonParser parser = jasonFactory.createParser(fr);
for (JsonToken token = parser.nextToken(); token != null; token = parser.nextToken()) {
System.out.println("CurrentToken = " + token + "\tname=" + parser.getCurrentName() + "\tasString=" + token.asString());
generator.flush();
switch (token) {
case START_OBJECT:
generator.writeStartObject();
break;
case END_OBJECT:
generator.writeEndObject();
break;
case START_ARRAY:
generator.writeStartArray();
break;
case END_ARRAY:
generator.writeEndArray();
break;
case FIELD_NAME:
generator.writeFieldName(parser.getCurrentName());
break;
case VALUE_STRING:
generator.writeString(parser.getValueAsString());
break;
case VALUE_NUMBER_INT:
// gen.writeNumber(parser.getIntValue());// 避免科学计数法问题
generator.writeNumber(parser.getValueAsString());// 为避免精度问题,这里按字符串读入,并按字符串写出
break;
case VALUE_NUMBER_FLOAT:
// gen.writeNumber(parser.getDoubleValue());// 有些数据会被转为科学计数法
// gen.writeNumber(new BigDecimal(parser.getDoubleValue()));// 精度太高了
generator.writeNumber(parser.getValueAsString());// 为避免精度问题,这里按字符串读入,并按字符串写出
break;
case VALUE_TRUE:
generator.writeBoolean(true);
break;
case VALUE_FALSE:
generator.writeBoolean(false);
break;
case VALUE_NULL:// * VALUE_NULL is returned when encountering literal "null" in value context
generator.writeNull();
break;
default: // 未处理:VALUE_EMBEDDED_OBJECT、 NOT_AVAILABLE:
throw new JsonGenerationException("未处理的", generator);
}
} // for
generator.flush();
generator.close();
}
public static void main(String[] args) {
try {
String file = "tmp.json";
StreamJacsonExample.readAndWriteWithStreamMode(file);
} catch (Throwable e) {
e.printStackTrace();
}
}