Exception in thread "pool-4-thread-1" java.lang.OutOfMemoryError at com.alibaba.fastjson2.JSONWriterUTF16.writeNameRaw(JSONWriterUTF16.java:561) at com.alibaba.fastjson2.writer.FieldWriterImpl.writeFieldName(FieldWriterImpl.java:143) at com.alibaba.fastjson2.writer.ObjectWriter_3.write(Unknown Source) at com.alibaba.fastjson2.writer.ObjectWriterImplList.write(ObjectWriterImplList.java:278) at com.alibaba.fastjson2.JSON.toJSONString(JSON.java:1757) ..... at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748)
protected final int maxArraySize; protected JSONWriter(Context context, Charset charset) { this.context = context; this.charset = charset; this.utf8 = charset == StandardCharsets.UTF_8; this.utf16 = charset == StandardCharsets.UTF_16; // 堆代码 duidaima.com quote = (context.features & Feature.UseSingleQuotes.mask) == 0 ? '"' : '\''; // 64M or 1G maxArraySize = (context.features & LargeObject.mask) != 0 ? 1073741824 : 67108864; }这边果然看到,有个注释,64M OR 1G,果然,是个配置项,看起来,这个配置项是受LargeObject这个控制的。一开始,我以为这个是com.alibaba.fastjson.serializer.SerializerFeature里的枚举项,结果并不是,没发现是JsonWriter的配置项:
com.alibaba.fastjson2.JSONWriter.Feature
// 十进制为:8589934592, 二进制为:001000000000000000000000000000000000 LargeObject(1L << 33),
JSON.toJSONString(t, JSONWriter.Feature.WriteClassName, JSONWriter.Feature.LargeObject).getBytes(DEFAULT_CHARSET);结果我看了我们版本,都2.0.19了,版本比他还高,结果没看到这个方法。服了,难道高版本还把这个方法删了?然后小伙子看我忙,就说他回去再研究研究,我说行,我也网上查下。
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>2.0.19</version> </dependency>这个内部其实还依赖了另外的jar:
<dependency> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2-extension</artifactId> </dependency>而上面的这个,又依赖了:
<dependency> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2</artifactId> </dependency>差不多,就是下图这样的关系:
然后,导致我们项目中,其实有两个JSON类:
com.alibaba.fastjson2.JSON; 位于fastjson2-2.0.19.jar com.alibaba.fastjson.JSON; 位于fastjson-2.0.19.jar而之前我们导入的是下面那个,也就是传统的com.alibaba.fastjson.JSON,里面就是没法传JsonWriter的Feature枚举的,只有上面那个才有:
com.alibaba.fastjson2.JSON#toJSONString(java.lang.Object, com.alibaba.fastjson2.JSONWriter.Feature...) /** * Serialize Java Object to JSON {@link String} with specified {@link JSONReader.Feature}s enabled * * @param object Java Object to be serialized into JSON {@link String} * @param features features to be enabled in serialization */ static String toJSONString(Object object, JSONWriter.Feature... features) {所以,剩下的事情,简单了,修改import的类为com.alibaba.fastjson2.JSON即可,然后序列化时传入feature:
String previewDataJson = JSON.toJSONString(dataList,LargeObject);问题解决。