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

2024-04-01

我有这段代码:

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()) ;
    }
}

当我尝试执行 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++;
}

}

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

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;
}

}

我有同样/类似的问题。在稍微不同的上下文中给出更清晰的答案:

我有以下方法产生错误“com.google.gson.internal.LinkedTreeMap 无法转换为 MyType”:

/**
   * Reads a LinkedHashMap from the specified parcel.
   * 
   * @param <TKey>
   *          The type of the key.
   * @param <TValue>
   *          The type of the value.
   * @param in
   *          The in parcel.
   * @return Returns an instance of linked hash map or null.
   */
  public static <TKey, TValue> LinkedHashMap<TKey, TValue> readLinkedHashMap(Parcel in) {
    Gson gson = JsonHelper.getGsonInstance();
    String content = in.readString();
    LinkedHashMap<TKey, TValue> result = gson.fromJson(content, new TypeToken<LinkedHashMap<TKey, TValue>>(){}.getType());
    return result;
  }

我想要一种简单的通用方法来读/写链接的哈希图。上述解决方案不起作用,因为据我所知,带有 TKey 和 TValue 的 TypeToken 的类型信息在编译后将丢失。这就是问题所在。如果您将代码更改为以下示例,那么它就可以工作,因为现在我们显式定义了类型标记。我对java不太感兴趣,所以我理解为什么在这种情况下可以在运行时读取类型信息。

/**
   * Reads a LinkedHashMap from the specified parcel.
   * 
   * @param <TKey>
   *          The type of the key.
   * @param <TValue>
   *          The type of the value.
   * @param in
   *          The in parcel.
   * @return Returns an instance of linked hash map or null.
   */
  public static <TKey, TValue> LinkedHashMap<TKey, TValue> readLinkedHashMap(Parcel in, TypeToken<LinkedHashMap<TKey, TValue>> typeToken) {
    Gson gson = JsonHelper.getGsonInstance();
    Type type = typeToken.getType();
    String content = in.readString();
    LinkedHashMap<TKey, TValue> result = gson.fromJson(content, type);
    return result;
  }

现在您可以像这样调用上面的函数:

readLinkedHashMap(in, new TypeToken<LinkedHashMap<UUID, MyObject>>(){});

旁注 1:编写 linkedhashmap 时,根本不需要指定任何类型标记。 toJson(map) 就足够了。

旁注 2(针对我遇到的问题):默认情况下,gson 使用 toString() 来序列化密钥。如果您为键类型(可能是更复杂的类型)注册类型适配器,则在序列化时不会应用此类型适配器,而是在反序列化时应用。这会导致流程不一致并因此失败。以下选项激活复杂的映射键序列化 https://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/GsonBuilder.html#enableComplexMapKeySerialization.

gsonBuilder.enableComplexMapKeySerialization()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GSON 转换为 LinkedHashMap 而不是我的对象 的相关文章

随机推荐

  • 构建 Keras Tensorboard 图

    当我创建一个简单的 Keras 模型时 model Sequential model add Dense 10 activation tanh input dim 1 model add Dense 1 activation linear
  • 如何在 UNIX shell 中将制表符分隔的文本复制到剪贴板,同时保留制表符?

    我正在尝试将 UNIX 环境中的文件的几行复制并粘贴到网页中 我想通过破坏选项卡来保留原始格式 但是 当我选择一段文本并将其复制并粘贴到网页中时 所有选项卡都已转换为不同长度的空格 有人可以告诉我如何保留原始标签吗 它需要尽可能简单 以便新
  • 数据库表命名,复数或单数[重复]

    这个问题在这里已经有答案了 命名数据库的表和模式时最好使用单数或复数 例如 应该是客户还是客户 命名时应该用Capital 如Customer或customer吗 关于命名有什么最佳实践吗 这个问题需要一场宗教战争 我毫不怀疑它应该是复数
  • C++11 空列表 联合的初始化 - 是否保证初始化联合的完整长度?

    在 C 11 中 我有以下联合 union SomeData std uint8 t Byte std uint16 t Word std uint32 t DWord unsigned char String 128 如果我这样初始化联合
  • Git checkout——恢复丢失的文件

    我不小心删除了 git 存储库上的本地文件更改 他们没有被承诺 甚至没有被推动 我做了什么 git 状态 然后显示未暂存提交的文件 并且我意外地通过此命令删除了名为 smdr 的整个文件夹 git checkout smdr 然后文件更改就
  • Latex中如何设置标题字体颜色

    Latex 中可以更改标题字体颜色吗 你可以看看sectsty包裹 secsty 包提供了一组命令 用于更改标准 LATEX 2 文档类中各个章节标题所使用的字体 1 从手册中 确保您在文档中包含该包 方法是在您的 文件序言 usepack
  • C++ - 如何使用 C++ 读取 Unicode 字符(例如印地语脚本),或者是否有通过其他编程语言更好的方法?

    我有一个像这样的印地语脚本文件 3 我必须编写一个程序 为每个句子中的每个单词添加一个位置 因此 特定单词位置的每一行的编号应以括号中的 1 开头 输出应该是这样的 3 1 2 3 4 5 6 7 8 9 上面这句话的意思是 3 India
  • 我需要在 asp.net 中屏蔽文本框

    该文本框中只能包含数字 条目必须在 100 到 500 之间 文本框需要包含 3 位小数 我不希望在将值插入数据库时 出现任何错误 我需要使用 jQuery 或 ASP NET 验证控件吗 如果 jQuery 有用 那么我会使用哪个插件 或
  • R 中的对称非负矩阵分解

    I am trying to implement NMF in R based on the following formula H is initially guess and then iteratively update based
  • 何时在 Angular + Java 项目中使用 DTO 和 Matpstruct

    好吧 我有一个大项目 我想把它做好 但我什至不知道规范是什么 Problem 我有几个具有关系的实体 我需要将它们一起显示在页面上 在视图中显示前 3 个事件 凡是Event有关系到事件实例 a 取消政策 并且对多个Pricing 截止日期
  • 获取用户在当前之前浏览过的页面

    代替 login php ref http mysite com lastpage 我可以通过其他方式获得之前的页面吗 尝试了 HTTP REFERER 但无法让它工作 Notice Undefined index HTTP REFERER
  • 渲染 svg 文件并使用 Express 提供服务

    我想知道如何使用 Express 渲染和提供 svg 文件 现在 我可以将 svg 作为原始 XML 文件提供 这是我正在做的事情 route router get status function req res next res setH
  • Rails 中的共享 JS(咖啡)

    如果我想在不同文件之间共享一些 JavaScript 函数应用程序 资产 javascript组织目录结构的最佳方法是什么 假设我有共享 js 咖啡 sharedFunction gt Hello 现在 我如何在其他地方使用它 就像这里一样
  • Solr 复制和 Solr 云有什么区别?

    我支持 Rails 项目 其中包含 Rails 应用程序和 Solr 的附加实例 我的环境 rails 3 2 1 ruby 2 1 2 sunspot 2 1 0 Solr 4 1 6 Problem 云提供商不稳定 我不能使用其他云提供
  • Pandas groupby - 计算相对点的距离

    假设我有一些看起来像这样的东西 df pd DataFrame Event A A A A A B B B B B Number 1 2 3 4 5 6 7 8 9 10 Ref False False False False True F
  • Nexus One - Android 2.1 版本,2.1 的 SDK 在哪里?

    搭载 2 1 操作系统的 Nexus Android 手机今天上市 我的朋友 刚刚订购了两个 隔夜运送 我想这意味着明天或后天就会在他手中 人们在他们的生活中拥有 2 1 版本 这怎么可能接受呢 在开发人员接触 SDK 之前就动手 我已经有
  • Selenium:查找基本 URL

    我在不同的机器上使用 Selenium 来自动测试 MVC Web 应用程序 我的问题是我无法获取每台机器的基本网址 我可以使用以下代码获取当前网址 IWebDriver driver new FirefoxDriver string cu
  • 80 端口上的 heroku + nginx

    我正在尝试在 heroku 免费环境中启动 nginx 服务器 我准备了任何操作方法和教程 但我无法运行它 首先 我想在端口 80 上启动 nginx 作为默认 Web 服务器 然后我想将 nginx 配置为 underline expre
  • 3个表之间的内连接

    我在数据库中有这些表 country id country 1 USA 2 Brazil 和段表 id country 1 USA 2 Brazil 我有第三张表 Id segment id country id 其中segment id是
  • GSON 转换为 LinkedHashMap 而不是我的对象

    我有这段代码 public abstract class Repository