Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fastjson 1.2.22到1.2.24,反序列化的对象中含有Throwable类型的属性时,报syntax error #1036

Closed
Viyond opened this issue Feb 24, 2017 · 8 comments · Fixed by #1037
Labels
Milestone

Comments

@Viyond
Copy link

Viyond commented Feb 24, 2017

如题,如果参与序列化的对象属性中包含了Throwable类型的属性时,在反序列化时,则会转换错误。
fastjson版本:从1.2.22到1.2.24版本均试过,均存在此类问题。

===================================================
测试代码case如下:
public class DefaultJsonSerializer {

private static final Charset CHARSET = Charset.forName("UTF-8");

public static <T> void serialize(T obj, OutputStream out) {
    JSONWriter writer = null;
    try {
        writer = new JSONWriter(new OutputStreamWriter(out, CHARSET.newEncoder().onMalformedInput(CodingErrorAction.IGNORE)));
        writer.config(SerializerFeature.QuoteFieldNames, true);
        writer.config(SerializerFeature.SkipTransientField, true);
        writer.config(SerializerFeature.SortField, true);
        writer.config(SerializerFeature.WriteEnumUsingToString, false);
        writer.config(SerializerFeature.WriteClassName, true);
        writer.config(SerializerFeature.DisableCircularReferenceDetect, true);
        writer.writeObject(obj);
        writer.flush();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (writer != null) {
            try {
                writer.close();
            } catch (Exception e) {
            }
        }
    }
}

public static <T> T deserialize(byte[] in) {
    return (T) JSON.parse(in, 0, in.length, CHARSET.newDecoder(), Feature.AllowArbitraryCommas,
            Feature.IgnoreNotMatch, Feature.SortFeidFastMatch, Feature.DisableCircularReferenceDetect,
            Feature.AutoCloseSource);
}

}

//****************** 测试代码 *************************
public class Result {
private T data;

private Throwable exception;

public Result(){}

public T getData() {
    return data;
}

public void setData(T data) {
    this.data = data;
}

public Throwable getException() {
    return exception;
}

public void setException(Throwable exception) {
    this.exception = exception;
}

}

//************** case ***************
public class ExceptionTest {

public static void main(String[] args) {
    NullPointerException exception = new NullPointerException("test");
    Result result = new Result();
    result.setException(exception);
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    try{
        DefaultJsonSerializer.serialize(result, bos);
        Object object = DefaultJsonSerializer.deserialize(bos.toByteArray());
        System.out.println("deserialize result:" + object);
    }catch (Throwable e){
        e.printStackTrace();
    }finally {
        try{
            bos.close();
        }catch (IOException e){
        }
    }
}

}

//**************** 报错如下 ****************
com.alibaba.fastjson.JSONException: syntax error
at com.alibaba.fastjson.parser.deserializer.ThrowableDeserializer.deserialze(ThrowableDeserializer.java:36)
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:530)
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:187)
at com.alibaba.fastjson.parser.deserializer.DefaultFieldDeserializer.parseField(DefaultFieldDeserializer.java:62)
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:547)
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:187)
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:183)
at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:355)
at com.alibaba.fastjson.parser.DefaultJSONParser.parse(DefaultJSONParser.java:1312)
at com.alibaba.fastjson.parser.DefaultJSONParser.parse(DefaultJSONParser.java:1278)
at com.alibaba.fastjson.JSON.parse(JSON.java:178)
at com.alibaba.fastjson.JSON.parse(JSON.java:162)
at tesla.client.test.json.DefaultJsonSerializer.deserialize(DefaultJsonSerializer.java:45)
at tesla.client.test.json.ExceptionTest.main(ExceptionTest.java:18)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

//************ 分割线 ***************
@wenshao 等其他fastjson的作者伙伴们帮忙看看,谢谢。

@Viyond
Copy link
Author

Viyond commented Feb 24, 2017

简单测试了下,貌似1.2.7版本的fastjson是没有这个问题的,所以猜测是后续版本的更新暴露了这个bug,谢谢。

@wuwen5
Copy link
Contributor

wuwen5 commented Feb 24, 2017

你测试的jdk 版本多少? 在1.7以下版本出现的么?

@wuwen5
Copy link
Contributor

wuwen5 commented Feb 24, 2017

我在1.7以上的jdk没有重现问题,本机上没有装1.7以下的jdk没法重现。

@wuwen5
Copy link
Contributor

wuwen5 commented Feb 24, 2017

不好意思,之前测试Result 没加泛型,没有重现问题。按照你的代码Result<T>加上泛型后确实重现了。

@Viyond
Copy link
Author

Viyond commented Feb 24, 2017

我的jdk 是 1.8的,不过貌似和jdk没有关系;这个bug 在fastjson 1.2.7 是没有的。

@Viyond
Copy link
Author

Viyond commented Mar 1, 2017

请问什么时候有修复版本?

wenshao added a commit that referenced this issue Mar 9, 2017
bug fixed for issue 1036 (DefaultFieldDeserializer).
@Viyond
Copy link
Author

Viyond commented Mar 13, 2017

什么都没有改,升级到1.2.28版本,执行上面的case,又开始报下面这个错误,
com.alibaba.fastjson.JSONException: autoType is not support.
at com.alibaba.fastjson.parser.ParserConfig.checkAutoType(ParserConfig.java:869)
at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:325)
at com.alibaba.fastjson.parser.DefaultJSONParser.parse(DefaultJSONParser.java:1335)
at com.alibaba.fastjson.parser.DefaultJSONParser.parse(DefaultJSONParser.java:1301)
at com.alibaba.fastjson.JSON.parse(JSON.java:189)
at com.alibaba.fastjson.JSON.parse(JSON.java:173)

@Viyond
Copy link
Author

Viyond commented Mar 13, 2017

增加了这个, System.setProperty("fastjson.parser.autoTypeSupport", "true");

还是报之前的历史错误:
com.alibaba.fastjson.JSONException: syntax error
at com.alibaba.fastjson.parser.deserializer.ThrowableDeserializer.deserialze(ThrowableDeserializer.java:36)
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:557)
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:188)

@wenshao wenshao added this to the 1.2.29 milestone Mar 13, 2017
@wenshao wenshao added the bug label Mar 13, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants