GSON转换为LinkedHashMap而不是我的对象

Dan*_*nca 9 java gson

我有这段代码:

public abstract class Repository<Entity extends BaseObject> {

...

public void readFromJson(){
    String content = "JSON content here";
    Gson gson = new Gson();
    Type entityType = new TypeToken<JSONObject<Entity>>(){}.getType();

    jsonObject = gson.fromJson(content, entityType);

    for (Entity ent : jsonObject.getEntities()) ;
    }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试执行foreach时,我的实体对象不再是Entity类型而是LinkedHashMap,我得到以下异常:java.lang.ClassCastException:java.util.LinkedHashMap无法强制转换为com.tranca.bookstore.domain.shared.BaseObject

这是JSONObject类(由我创建)

public class JSONObject<Entity> {

private List<Entity> entities = new ArrayList<Entity>();
private long lastId = -1;
public List<Entity> getEntities() {
    return entities;
}
public void setEntities(List<Entity> entities) {
    this.entities = entities;
}
public long getLastId() {
    return lastId;
}
public void setLastId(long lastId) {
    this.lastId = lastId;
}

public void incrementLastId() {
    this.lastId++;
}
Run Code Online (Sandbox Code Playgroud)

}

也许基础对象是相关的,所以我将代码放在这里:

public abstract class BaseObject implements Serializable {

protected long id = (long) -1;
protected int version = 0;

protected BaseObject(){}

public long getId() {
    return id;
}
public void setId(long id) {
    this.id = id;
}
public int getVersion() {
    return version;
}
public void setVersion(int version) {
    this.version = version;
}

}
Run Code Online (Sandbox Code Playgroud)

Dan*_*nca 2

终于明白了!

问题是:

新的 TypeToken< JSONObject< Entity>>(){}.getType();

返回 JSONObject< T> 的类型,而不是扩展 Repository 的子类的特定实体(例如 UserRepository 扩展 Repository< User>)。

诀窍是创建一个抽象方法来强制子类设置反序列化的类型。

总之,如果您收到此错误,请确保您拥有正确的类类型(如果您使用子类,请确保它返回子类的类型而不是超类)。

  • 抱歉,我遇到了同样的问题,但我不明白你的答案,你能澄清一下吗?谢谢! (6认同)