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

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

Open
BohrX opened this issue Nov 27, 2024 · 0 comments
Labels
bug Something isn't working

Comments

@BohrX
Copy link

BohrX commented Nov 27, 2024

问题描述

使用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的问题, 数组也应该需要做相同处理。

@BohrX BohrX added the bug Something isn't working label Nov 27, 2024
@BohrX BohrX changed the title [BUG] 使用JSON.to或者JSONObject.getObject JSONObject.getObject时;反序列化的Bean中包含对象数组,SupportSmartMatch对于对象数组中的对象不生效 [BUG] [SupportSmartMatch] 使用JSON.to或者JSONObject.getObject JSONObject.getObject时;反序列化的Bean中包含对象数组,SupportSmartMatch对于对象数组中的对象不生效 Nov 27, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

1 participant