使用jackson按流模式读写超大JSON文件

使用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();
		}
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值