fastjson Bug Report: Different Behavior Between jsonObject.toJavaObject & JSON.parseObject

xxhby3vn  于 4个月前  发布在  Java
关注(0)|答案(1)|浏览(57)

反序列化的时候可以使用 JSONObjecttoJavaObject 方法,也可以使用 JSON 类的静态方法 parseObject ,直觉上它们应该是等价的,但有时候这两个方法具有不同的行为:

我基于 1.2.72 来编写这段代码,根据 #3266 ,这段代码使用了 1.2.71 引入的新特性 。

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.annotation.JSONCreator;
import com.alibaba.fastjson.annotation.JSONField;
import java.util.NoSuchElementException;

public enum Result {

    Win(1),
    Draw(0),
    Loss(-1),
    ;

    private final int code;

    Result(int code) {
        this.code = code;
    }

    @JSONField
    public int getCode() {
        return code;
    }

    @JSONCreator
    public static Result from(int code) {
        for (Result value : values()) {
            if (value.code == code) {
                return value;
            }
        }
        throw new NoSuchElementException("cannot find result by " + code);
    }

    static class Expect {

        public static void main(String[] args) {
            Result result = JSON.parseObject("-1", Result.class);
            if (result != Loss) {
                throw new AssertionError("result is " + result);
            }
        }
    }

    static class Unexpect {

        public static void main(String[] args) {
            Result result = JSON.parseObject("-1").toJavaObject(Result.class);
            if (result != Loss) {
                throw new AssertionError("result is " + result);
            }
        }
    }
}
ajsxfq5m

ajsxfq5m1#

1.2.76 执行, Unexpect 依然报错,但报错内容和 1.2.72 不一样。

相关问题