Skip to content

[BUG] [SupportSmartMatch] 使用JSON.to或者JSONObject.getObject JSONObject.getObject时;反序列化的Bean中包含对象数组,SupportSmartMatch对于对象数组中的对象不生效 #3183

@BohrX

Description

@BohrX

问题描述

使用JSON.to或者JSONObject.getObject JSONObject.getObject时;反序列化的Bean中包含对象数组,SupportSmartMatch对于对象数组中的对象不生效

涉及api:
com.alibaba.fastjson2.JSONObject#getObject(java.lang.String, java.lang.Class, com.alibaba.fastjson2.JSONReader.Feature...)
com.alibaba.fastjson2.JSON#to

环境信息

  • OS信息: Win11
  • JDK信息: 1.8
  • 版本信息:Fastjson2 2.0.53

重现步骤

import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;

import org.assertj.core.api.Assertions;
import org.junit.Before;
import org.junit.Test;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.JSONReader;

import lombok.Data;

public class ObjToBeanFeatureTest {

    @Before
    public void setUp() throws Exception {
        JSON.config(JSONReader.Feature.SupportSmartMatch, false);
    }

    @Test
    public void arrayTest() {
        String text = "{\"someInfoArr\":[{\"siteID\":1}, {\"siteID\":2}]}";

        JSON.config(JSONReader.Feature.SupportSmartMatch, true);
        // 反序列化,无问题
        Bean bean2 = JSON.parseObject(text, Bean.class);
        Assertions.assertThat(bean2.getSomeInfoArr()[0].siteId).isEqualTo(1);

        Map<String, Object> jsonObject = JSON.parseObject(text);
        Assertions.assertThat(((Map<?, ?>) ((List<?>) jsonObject.get("someInfoArr")).get(0))
                .get("siteID")).isEqualTo(1);

        JSONObject obj = new JSONObject();
        obj.put("v1", jsonObject);

        // 两个API均无法正确反序列化
        Bean bean3 = obj.getObject("v1", Bean.class, JSONReader.Feature.SupportSmartMatch);
        Assertions.assertThat(bean3.getSomeInfoArr()[0].siteId).isEqualTo(null);

        Bean bean4 = JSON.to(Bean.class, jsonObject);
        Assertions.assertThat(bean4.getSomeInfoArr()[0].siteId).isEqualTo(null);
    }

    @Test
    public void listTest() {
        String text = "{\"someInfoList\":[{\"siteID\":1}, {\"siteID\":5}]}";
        
        // 反序列化,无问题
        JSON.config(JSONReader.Feature.SupportSmartMatch, true);
        Bean bean2 = JSON.parseObject(text, Bean.class);
        Assertions.assertThat(bean2.getSomeInfoList().get(0).siteId).isEqualTo(1);

        Map<String, Object> jsonObject = JSON.parseObject(text);
        Assertions.assertThat(((Map<?, ?>) ((List<?>) jsonObject.get("someInfoList")).get(0))
                .get("siteID")).isEqualTo(1);

        JSONObject obj = new JSONObject();
        obj.put("v1", jsonObject);

        // 无问题
        Bean bean3 = obj.getObject("v1", Bean.class, JSONReader.Feature.SupportSmartMatch);
        Assertions.assertThat(bean3.getSomeInfoList().get(0).siteId).isEqualTo(1);

        Bean bean4 = JSON.to(Bean.class, jsonObject);
        Assertions.assertThat(bean4.getSomeInfoList().get(0).siteId).isEqualTo(1);
    }

    @Test
    public void setTest() {
        String text = "{\"someInfoSet\":[{\"siteID\":1}, {\"siteID\":5}]}";

        // 反序列化,无问题
        JSON.config(JSONReader.Feature.SupportSmartMatch, true);
        Bean bean2 = JSON.parseObject(text, Bean.class);
        Assertions.assertThat(bean2.getSomeInfoSet().stream().findFirst().get().siteId).isEqualTo(1);

        Map<String, Object> jsonObject = JSON.parseObject(text);
        Assertions.assertThat(((Map<?, ?>) ((List<?>) jsonObject.get("someInfoSet")).get(0))
                .get("siteID")).isEqualTo(1);

        JSONObject obj = new JSONObject();
        obj.put("v1", jsonObject);

        // 无问题
        Bean bean3 = obj.getObject("v1", Bean.class, JSONReader.Feature.SupportSmartMatch);
        Assertions.assertThat(bean3.getSomeInfoSet().stream().findFirst().get().siteId).isEqualTo(1);

        Bean bean4 = JSON.to(Bean.class, jsonObject);
        Assertions.assertThat(bean4.getSomeInfoSet().stream().findFirst().get().siteId).isEqualTo(1);
    }

    @Data
    private static class Bean {

        private SomeInfo[] someInfoArr;
        private List<SomeInfo> someInfoList;
        private LinkedHashSet<SomeInfo> someInfoSet;
    }

    @Data
    private static class SomeInfo {
        private Integer siteId;
    }
}

期待的正确结果

2.0.51 修复了List的问题, 数组也应该需要做相同处理。

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions