fastjson 反馈3个问题和一个创意

xggvc2p6  于 2021-11-27  发布在  Java
关注(0)|答案(6)|浏览(359)

问题1:某些情况下产生非标准json数据

UserGroupModel group = new UserGroupModel();
group.id = 9999;
group.users = new ArrayList<>();
group.users2 = new LinkedHashMap<>();
group.users3 = new TreeSet<>();// 如果只有空示例,反序列化时无法解析json
上面的TreeSet为空示例上,序列化出来的数组是:...users3:TreeSet[]。。。进行反序列化时,就会提示解析出错(感觉这个格式也不像json标准,别的框架不好解析...)。

问题2:有些集合进行类型表示(例List),或者表示不合理。

像上面这样:TreeSet[],应该是不合理,应该是非标准json结构;另外,像上面的 users 不会有类型标注,如果 users = new LinkedList() ,就无法还原类型。(类型也不够全,像Queue,就不能玩了...)

问题3:反序列化时,有时不能根据json申明的@type来。

像上面的代码,users2 反序列化回来后变成了:HashMap。这算应该算是有问题。

创意想法:为集合添加友好的数据类型

目前用: {'@type':'x.x.x'} 来为一个对象添加类型申明;;;可以考虑使用:[{'@type':'x.x.x'},[]] 为集合添加类型申明(后面的[]存放真实的数组数据)。

另外,建议如果有@type 申请的,优先用@type类型。

因为正在重构一个自己多年前的json框架(新命名:snack3)
从 fastjson 这儿吸收了不少营养,特来反馈一下

gwbalxhn

gwbalxhn1#

提供下 UserGroupModel

wsewodh2

wsewodh22#

模型

public class UserGroupModel {
    public long id;
    public List<UserModel> users;
    public Map<Integer,UserModel> users2;
    public Set<UserModel> users3;
    public String[] names;
    public short[] ids;
    public Integer[] iids;
    public BigDecimal dd;
    public Timestamp tt1;
    public Date tt2;
}

public class UserModel {
    public int id;
    public String name;
    public String note;
}

测试数据

UserGroupModel group = new UserGroupModel();
        group.id = 9999;
        group.users = new ArrayList<>();
        group.users2 = new LinkedHashMap<>();
        group.users3 = new TreeSet<>();
        group.names = new String[5];
        group.ids = new short[5];
        group.iids = new Integer[5];
        group.dd = new BigDecimal(12);
        group.tt1 = new Timestamp(new Date().getTime());
        group.tt2 = new Date();

        for (short i = 0; i < 5 ; i++) {
            UserModel user = new UserModel();
            user.id = i;
            user.name = "张三" + i;
            user.note = null;
            group.users.add(user);
            group.users2.put(Integer.valueOf(i),user);
            group.names[i] = "李四" + i;
            group.ids[i] = i;
        }
mwngjboj

mwngjboj3#

@noear

  • 非标准 json 问题使用 master 分支没有复现, 不知道你用的哪个版本
  • 反序列化时, users2 生成 HashMap 是合理的,因为你的模型中 users2 声明的是 Map 不是 LinkedHashMap
pcrecxhr

pcrecxhr4#

@timandy

  • 我用的版本是:1.2.29
  • 生成HashMap,我觉得是不合理的。Map的原生实现就有好几个,再加上自定义实现的。。。不能随便弄了个Map。。。从代码上看,序列化时已记录:@type=LinkedHashMap了;但是反序列化时,没用起来。原因是,代码有bug:
//MapDeserializer类,300多行处,即下面两块代码,顺序换一下即可解决这个问题。。。。
        if (type == Map.class || type == HashMap.class) {
            return new HashMap();
        }

        if (type == LinkedHashMap.class) {
            return new LinkedHashMap();
        }

但是,仍然有问题。。。如果有申明 @type 的,还是应该要优化用 clazz.newInstance() (解决自定义的一些Map实现)。。。就是要优化用 @type 申明的类型。

dl5txlt9

dl5txlt95#

@timandy
另外,希望考虑为 [] 数据,添加类型申明。。。即我提的那个创意想法。

brc7rcf0

brc7rcf06#

序列化的时候没有生成 @type

相关问题