alibaba / fastjson2

🚄 FASTJSON2 is a Java JSON library with excellent performance.
Apache License 2.0
3.82k stars 499 forks source link

[BUG] 当@type不是json中第一个field时 autoType无法工作 #2404

Closed shentuzhigang closed 8 months ago

shentuzhigang commented 8 months ago

问题描述

简要描述您碰到的问题。 当@type不是json中第一个field时 autoType无法工作。

环境信息

请填写以下信息:

重现步骤

如何操作可以重现该问题:

  1. 使用 xxx.xxx 方法
  2. 输入 ... 数据
  3. 出现 ... 错误
    
    //可在此输入示例代码

public class Tests {

private static final Filter autoTypeFilter = JSONReader.autoTypeFilter(
        // 按需加上需要支持自动类型的类名前缀,范围越小越安全
        "cn.shentuzhigang.niwan"
);

@Data
public class SinaQrCodeAuthentication {

    public SinaQrCodeAuthentication() {
    }

    public SinaQrCodeAuthentication(String qrid, String qrcode) {
        this.qrid = qrid;
        this.qrcode = qrcode;
    }

    /**
     * 二维码id
     */
    private String qrid;
    /**
     * 二维码
     */
    private String qrcode;
}

@Test
public void test() throws Exception {
    SinaQrCodeAuthentication person = new SinaQrCodeAuthentication("1", "2");
    String jsonString = JSON.toJSONString(person, JSONWriter.Feature.WriteClassName);
    System.out.println(jsonString);
    Object object = JSON.parseObject(jsonString, Authentication.class, autoTypeFilter);
    System.out.println(object);

// bug start Object object1 = JSON.parseObject("{\"qrcode\":\"2\",\"@type\":\"cn.shentuzhigang.niwan.test.Tests$SinaQrCodeAuthentication\",\"qrid\":\"1\"}", Authentication.class, autoTypeFilter); System.out.println(object1); } }

but

{"@type":"cn.shentuzhigang.niwan.test.Tests$SinaQrCodeAuthentication","qrcode":"2","qrid":"1"} Tests.SinaQrCodeAuthentication(qrid=1, qrcode=2) {"qrcode":"2","@type":"cn.shentuzhigang.niwan.test.Tests$SinaQrCodeAuthentication","qrid":"1"}



### 期待的正确结果
*对您期望发生的结果进行清晰简洁的描述。*

### 相关日志输出
*请复制并粘贴任何相关的日志输出。*

#### 附加信息
*如果你还有其他需要提供的信息,可以在这里填写(可以提供截图、视频等)。*
wenshao commented 8 months ago

设计就是这样的,在未来也不会支持