Java 使用GSON使用自定义比较器反序列化扩展TreeSet的类

Java 使用GSON使用自定义比较器反序列化扩展TreeSet的类,java,json,gson,Java,Json,Gson,我有一个类扩展了TreeSet类。它的构造函数为树集提供了一个自定义比较器: public class SortedPersonSet extends TreeSet<Person> { public SortedPersonSet(Comparator<Person> comp) { super(comp); } } Type type = new TypeToken<TreeSet<Person>>() { }

我有一个类扩展了
TreeSet
类。它的构造函数为
树集提供了一个自定义比较器:

public class SortedPersonSet extends TreeSet<Person> {
    public SortedPersonSet(Comparator<Person> comp) {
        super(comp);
    }
}
Type type = new TypeToken<TreeSet<Person>>() {
}.getType();
TreeSet<Person> newPersons = gsonb.fromJson(personSetAsString, type);
但是,此版本引发异常,因为类
Person
未实现
Comparable

因此,我尝试了一种方法,该方法通过实现一个定制的
JsonDeserializer
来帮助实现,它使用一个定制的比较器返回一个
SortedPersonSet

 public class SortedSetDeserializer implements JsonDeserializer<SortedPersonSet> {

    @Override
    public SortedPersonSet deserialize(JsonElement json, Type typeOfT,
            JsonDeserializationContext context) throws JsonParseException {
        return new SortedPersonSet((p1, p2) -> Long.compare(p1.getAge(), p2.getAge()));
    }
}

// Deserialization in main
Gson gsonb = new GsonBuilder()
                .registerTypeAdapter(SortedPersonSet.class, new SortedSetDeserializer()).create();

SortedPersonSet newPersons = gsonb.fromJson(personSetAsString, SortedPersonSet.class);
System.out.println(newPersons);
公共类SortedSetDeserializer实现JsonDeserializer{
@凌驾
公共SortedPersonSet反序列化(JsonElement json,类型为typeOfT,
JsonDeserializationContext)抛出JsonParseException{
返回新的SortedPersonSet((p1,p2)->Long.compare(p1.getAge(),p2.getAge());
}
}
//主目录中的反序列化
Gson gsonb=新的GsonBuilder()
.registerTypeAdapter(sortedPersSet.class,新的SortedSetDeserializer()).create();
SortedPersonSet newPersons=gsonb.fromJson(personSetAsString,SortedPersonSet.class);
System.out.println(新人);
不幸的是,我的代码中仍然存在一个错误,因为当我通过
sortedpersSet-newPersons=gsonb.fromJson(personSetAsString,sortedpersSet.class)反序列化JSON字符串时,生成的
sortedPersSet
为空。我希望你能指出我犯错误的地方。另一个(希望更简单)的选择也将受到欢迎


提前谢谢

结果集为空,因为在自定义反序列化程序中不分析数组;仅创建新集合并返回它。具有真正反序列化类的简单实现应如下所示:

class SortedSetDeserializer implements JsonDeserializer<SortedPersonSet> {

    @Override
    public SortedPersonSet deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        SortedPersonSet people = new SortedPersonSet(Comparator.comparingLong(Person::getAge));
        if (json.isJsonArray()) {
            JsonArray array = json.getAsJsonArray();
            array.forEach(e -> {
                people.add(context.deserialize(e, Person.class));
            });
        }
        return people;
    }
}
您可以轻松地将此数组反序列化到
TreeSet

public class SortedPersonSet extends TreeSet<Person> {
    public SortedPersonSet(Comparator<Person> comp) {
        super(comp);
    }
}
Type type = new TypeToken<TreeSet<Person>>() {
}.getType();
TreeSet<Person> newPersons = gsonb.fromJson(personSetAsString, type);
Type Type=new-TypeToken(){
}.getType();
TreeSet newPersons=gsonb.fromJson(personSetAsString,类型);