fastjson2
fastjson2 copied to clipboard
[BUG]反序列化报错 JSONException
问题描述
通过fastjson2将数据序列化写到redis中,后续再读出来就报错,错误信息如下:
Caused by: com.alibaba.fastjson2.JSONException: illegal fieldName input:, offset 132, character :, line 1, column 132, fastjson-version 2.0.46 {"@type":"com.zzwtec.interfaces.ResultObject","code":"0","data":{"@type":"[com.zzwtec.interfaces.basedata.dto.DoorCardDTO","@value":[]},"msg":"success","requestId":"zzwandroid-tdHVEBu9b1VGPSaps29x3Dk2W3UxQnMm","success":true}
at com.alibaba.fastjson2.JSONReaderUTF8.readFieldNameHashCode(JSONReaderUTF8.java:2726)
at com.alibaba.fastjson2.reader.ORG_4_4_ResultObject.readObject(Unknown Source)
at com.alibaba.fastjson2.reader.ObjectReaderImplObject.readObject(ObjectReaderImplObject.java:129)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:806)
我是重写了序列化类,代码如下
package com.zzwtec.common.json;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer;
import com.alibaba.fastjson2.JSONException;
import com.alibaba.fastjson2.JSONWriter;
import com.alibaba.fastjson2.writer.ObjectWriter;
import org.springframework.data.redis.serializer.SerializationException;
import java.lang.reflect.Type;
public class MyGenericFastJsonRedisSerializer extends GenericFastJsonRedisSerializer {
@Override
public byte[] serialize(Object object) throws SerializationException {
if (object == null) {
return new byte[0];
} else {
try {
JSONWriter.Context context = JSON.createWriteContext(SerializeConfig.global, JSON.DEFAULT_GENERATE_FEATURE, new SerializerFeature[]{SerializerFeature.WriteClassName});
context.config(JSONWriter.Feature.NotWriteNumberClassName);
try {
JSONWriter writer = JSONWriter.ofUTF8(context);
byte[] var11;
try {
if (object == null) {
writer.writeNull();
} else {
writer.setRootObject(object);
Class<?> valueClass = object.getClass();
ObjectWriter objectWriter = context.getObjectWriter(valueClass, valueClass);
objectWriter.write(writer, object, (Object)null, (Type)null, 0L);
}
var11 = writer.getBytes();
} catch (Throwable var7) {
if (writer != null) {
try {
writer.close();
} catch (Throwable var6) {
var7.addSuppressed(var6);
}
}
throw var7;
}
if (writer != null) {
writer.close();
}
return var11;
} catch (JSONException var8) {
Throwable cause = var8.getCause() != null ? var8.getCause() : var8;
throw new com.alibaba.fastjson.JSONException("toJSONBytes error", (Throwable)cause);
} catch (RuntimeException var9) {
throw new com.alibaba.fastjson.JSONException("toJSONBytes error", var9);
}
} catch (Exception var3) {
throw new SerializationException("Could not serialize: " + var3.getMessage(), var3);
}
}
}
}
环境信息
- OS信息: [e.g.:CentOS Linux 7 (Core)]
- JDK信息: [e.g.:Openjdk 1.8.0_252]
- 版本信息:[e.g.:Fastjson2 2.0.46]
### 期待的正确结果
能正常解析不报错
@Test
public void test() {
Container container = new Container();
container.data = new Bean[] {};
String str = JSON.toJSONString(container, JSONWriter.Feature.WriteClassName);
Container container2 = (Container) JSON.parseObject(str, Object.class, JSONReader.Feature.SupportAutoType);
assertNotNull(container2);
}
public static class Bean {
public int id;
}
public static class Container {
public Object data;
}
我这里没重现问题
试试序列化到redis再从redis读出来看看
我单元测试也是没问题,但添加redis的存储和读取就出问题了。
我单元测试也是没问题,但添加redis的存储和读取就出问题了。
解决了吗?
com.alibaba.fastjson2.JSONException: not support 7 at com.alibaba.fastjson2.JSONPathParser.parse(JSONPathParser.java:109) at com.alibaba.fastjson2.JSONPath.of(JSONPath.java:475) at com.alibaba.fastjson2.reader.FieldReader.addResolveTask(FieldReader.java:193) at com.alibaba.fastjson2.reader.ObjectReaderNoneDefaultConstructor.readJSONBObject(ObjectReaderNoneDefaultConstructor.java:189) at com.alibaba.fastjson2.reader.ObjectReaderImplList.readJSONBObject(ObjectReaderImplList.java:519) at com.alibaba.fastjson2.reader.FieldReaderObject.readFieldValue(FieldReaderObject.java:294) at com.alibaba.fastjson2.reader.ObjectReaderNoneDefaultConstructor.readJSONBObject(ObjectReaderNoneDefaultConstructor.java:159) at com.alibaba.fastjson2.JSONReaderJSONB.readAny(JSONReaderJSONB.java:796) at com.alibaba.fastjson2.JSONReaderJSONB.readArray(JSONReaderJSONB.java:1150) at com.alibaba.fastjson2.reader.ObjectReaderImplMap.readJSONBObject(ObjectReaderImplMap.java:405) at com.alibaba.fastjson2.reader.ObjectReaderImplObject.readJSONBObject(ObjectReaderImplObject.java:318) at com.alibaba.fastjson2.reader.ORG_7_4_Response.readJSONBObject(Unknown Source) at com.alibaba.fastjson2.JSONB.parseObject(JSONB.java:591)