【问题标题】:Convert LinkedHashMap into custom java object android将 LinkedHashMap 转换为自定义 java 对象 android
【发布时间】:2018-12-05 22:47:49
【问题描述】:

我正在使用jackson 将对象读写到本地 json 文件中。
它成功地读取和写入值。但问题是当我从文件中读取值时。并将它分配给我的对象它给我一个错误。

java.lang.ClassCastException:java.util.LinkedHashMap 无法转换为 com.testing.FeedItem

我知道错误的原因是因为要从文件中读取值 jackons 使用 LinkedHashMap 所以,LinkedHashMap 不能转换为对象(FeedItem)

这是我正在使用的。

PostFeed

  public class PostFeed{
       private String name;
       private List<FeedItem> feeditemList;
       // other code getter setter etc
  }

从文件中读取值

ObjectMapper objectMapper = new ObjectMapper();
PostFeed postFeed = objectMapper.readValue(offlinePrivateFeed, PostFeed.class);

FeedItem feedItem = postFeed.getFeedList().get(0); // Error

将写入值更新到本地文件

     ObjectMapper objectMapper = new ObjectMapper();
     objectMapper.writeValue(Utils.getOutputJsonFile("private-feed"), postFeed);

我发现了类似的问题LinkedhashMap can not cast to model Account 但这个问题对我来说没有用,几乎我尝试了所有答案,但没有人解决我的问题。

你能告诉我如何解决这个问题吗?

更新:FeedItem

  public class FeedItem{
     private String name;
     private int badge;
     private Boolean allow;
     // other code getter setter etc
  }

更新:JSON 文件

{
 "feedName": "test123",
 "time" : "7-7-1994",
 "feedList": [
  {
   "name": "feedItemName",
   "badge": 4,
   "allow": false
  },
  {
   "name": "feedItemName",
   "badge": 1,
   "allow": true
  },
  {
   "name": "feedItemName",
   "badge": 2,
   "allow": false
  }

  ]

}

更新:解决方案

通过将LinkedHashMap 转换为自定义对象FeedItem 可以解决这个问题,但问题是我们如何将LinkedHashMap 转换为Object

【问题讨论】:

  • 那么,您知道错误的原因了……您还需要我们向您解释什么?
  • 我想如何将LinkedHashMap 分配给我的对象(FeedItem)?
  • 嗯...不是。您可能想要映射 LinkedHashMap 的内容
  • 你能展示一下你的本地文件是什么样子的吗?
  • @Stultuske 我只想将LinkedHashMap 转换为对象FeedItem

标签: java android jackson jackson2


【解决方案1】:

LinkedHashMap 实现 Map 而不是 List

https://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashMap.html

也许将您的 feeditemList 字段类型更改为 LinkedHashMap

【讨论】:

  • 我无法更改它,因为我使用的是 Google Cloud Endpoint 库,而 FeedItem 是自动生成的文件
【解决方案2】:

如果您的 PostFeed 对象不为空,则尝试此代码,然后 feeditemList 也不为空,然后在下面的代码中使用..

    if (postFeed!=null &&  !postFeed.getFeedList().isEmpty()){

        FeedItem feedItem = postFeed.getFeedList().get(0);
    }

【讨论】:

  • 兄弟,如果您阅读了我的问题,这不是NullPointerExcdption 它是ClassCastException
  • 抱歉,我认为 PostFeed 出错 postFeed = objectMapper.readValue(offlinePrivateFeed, PostFeed.class);这一行不是这一行 FeedItem feedItem = postFeed.getFeedList().get(0);
  • 你可以调试检查一下。
  • 我知道错误在哪里以及错误是什么因为问题是我不知道如何解决这个问题
  • 从本地文件,我更新了我的问题,看看我如何在本地文件中写入值
【解决方案3】:

试试这个:

`  public class PostFeed{
       private String name;
       private LinkedHashMap<FeedItem> feeditemList;
//     private Map<FreedItem> freeditemlist
       // or you can also do this
       // other code getter setter etc
  }`

因为 LinkedHashMap 实现的是 Map 而不是 List

【讨论】:

  • 正如我已经评论的那样,我无法更改此文件,因为它是从 Google 云存储自动生成的文件
  • 好的,所以您必须将检索到的数据转换为 FeedItem 对象
  • 首先尝试了解您在 postFeed.getFeedList().get(0) 中得到了什么;通过将其放入对象类型字段中,您可以相应地进行转换
  • 我从postFeed.getFeedList().get(0) 得到LinkedHashMap 将其转换为FeedItem 不起作用同样的错误
  • 并且在您的代码中 LinkedHashMap 需要两个参数 keyvalue 每个项目的值类型不同。检查更新
猜你喜欢
  • 2014-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多