fastjson2 icon indicating copy to clipboard operation
fastjson2 copied to clipboard

[BUG]反序列化报错 JSONException

Open dengly opened this issue 1 year ago • 5 comments

问题描述

通过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]

### 期待的正确结果
能正常解析不报错

dengly avatar Feb 01 '24 07:02 dengly

  @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;
    }

我这里没重现问题

wenshao avatar Feb 23 '24 21:02 wenshao

试试序列化到redis再从redis读出来看看

dengly avatar Mar 06 '24 02:03 dengly

我单元测试也是没问题,但添加redis的存储和读取就出问题了。

dengly avatar Mar 06 '24 02:03 dengly

我单元测试也是没问题,但添加redis的存储和读取就出问题了。

解决了吗?

mek1986 avatar Apr 01 '24 06:04 mek1986

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)

pigeon-fancier avatar Apr 19 '24 08:04 pigeon-fancier