fastjson2 icon indicating copy to clipboard operation
fastjson2 copied to clipboard

[BUG] Deserialization to JSONObject when using SortedMap

Open He-Pin opened this issue 1 year ago • 3 comments

xxxObject { private SortedMap<Integer, AckSampleConfig> ackSampleConfig; }

it works if the SortedMap is Map, otherwise classcastException throws.

He-Pin avatar Dec 13 '23 12:12 He-Pin

    @Test
    public void test() {
        String str = "{\"items\":{1:{\"id\":123}}}";
        Bean bean = JSON.parseObject(str, Bean.class);
        assertEquals(1, bean.items.size());
        assertEquals(123, bean.items.get(1).id);
    }

    @Data
    public static class Bean {
        private SortedMap<Integer, Item> items;
    }

    public static class Item {
        public int id;
    }

问题没重现

wenshao avatar Dec 18 '23 01:12 wenshao

我们多了一个层级。

class NamespaceConfigs {
   Map<String, XXXConfig> configs;
}

class XXXConfig {
private SortedMap<Integer, AckSampleConfig> ackSampleConfig;
}

然后解析的时候用的

var configs = JSON.parseObject(json, NamespaceConfigs.class, new TypeReference<>);

He-Pin avatar Dec 18 '23 05:12 He-Pin

  @Test
    public void test() {
        String str = "{\"items\":{1:{\"config\":{2:{\"id\":123}}}}}";
        Bean bean = JSON.parseObject(str, Bean.class);
        assertEquals(1, bean.items.size());
        assertEquals(123, bean.items.get(1).getConfig().get(2).id);
    }

    @Data
    public static class Bean {
        private Map<Integer, XXXConfig> items;
    }

    public static class XXXConfig {
        private SortedMap<Integer, AckSampleConfig> config;

        public SortedMap<Integer, AckSampleConfig> getConfig() {
            return config;
        }

        public void setConfig(SortedMap<Integer, AckSampleConfig> config) {
            this.config = config;
        }
    }

    public static class AckSampleConfig {
        public int id;
    }

问题未重现,你可帮忙构建一个简化能重现问题的case么?

wenshao avatar Dec 21 '23 13:12 wenshao