【问题标题】:android jackson json object mapper array deserializationandroid jackson json对象映射器数组反序列化
【发布时间】:2011-06-28 19:03:22
【问题描述】:

我需要帮助将杰克逊映射器的响应解析为 POJO。我有这个作为回应:

 "data": [{
        "item": {
            "downloaded": false,
            "moderated": false,
            "add": false
        }
    },
    {
        "item": {
            "downloaded": false,
            "moderated": false,
            "add": false }
// more

那么我如何将这个与映射器绑定到 POJO? 这是我正在尝试的课程,但它返回“项目”无法识别且不允许被忽略。

public ArrayList<Item> data =  new ArrayList<Item>();

其中 item 是一个公共静态类 Item ,它带有构造函数,上面的所有字段都带有 getter 和 setter。

我该怎么做。我似乎无法在任何地方找到如何以这种方式从数组中读取数据。

【问题讨论】:

  • JSON 结构看起来很多余:为什么那里有“项目”条目?这是从 XML 转换而来的还是什么?另外:请包括 Item 类的定义(或表明您也希望它被定义)

标签: android json jackson pojo


【解决方案1】:
JsonNode jsonNode = mapper.readValue(s, JsonNode.class); 
JsonNode userCards = jsonNode.path("data");
List<Item> list = mapper.readValue(userCards.toString(), new TypeReference<List<Item>>(){});

【讨论】:

  • 如果您在其中包含一些文本来解释它如何为什么它解决了这个问题,这个答案会更好。
  • 我发现这种方法比 StaxMan 的方法更可取。原因是 StaxMan 需要一个额外的对象来包装数组/列表。这种方法只需要额外的一行。我重写了我的代码,与 maziar 的代码略有不同,消除了额外的一行。请参阅我的答案,尽管它只是 maziar 的变体。
  • @awoodland : 有人可能比我解释得更好;但是,简单来说,问题在于 OP 的 JSON 不是 Item 类型的单个对象,它是 Items 的数组/列表。你必须告诉杰克逊期待一个列表,而不是一个对象。请参阅下面的答案,这更简单,对您来说可能更有意义。首先转换为 JsonNode 有效,但似乎是多余的(AFAIK)。我可能是错的,也许输出中缺少某些东西。不过似乎对我有用。
【解决方案2】:

您的示例缺少几部分(尤其是 Item 的定义),以了解您的结构是否兼容;但一般来说 JSON 和 Object 结构需要匹配。所以,你至少需要这样的东西:

public class DataWrapper {
  public List<Item> data; // or if you prefer, setters+getters
}

如果是这样,您将绑定:

DataWrapper wrapper = mapper.readValue(json, DataWrapper.class);

和访问数据

List<Item> items = wrapper.data;

【讨论】:

    【解决方案3】:

    这是我的 maziar 代码变体。

    List<Item> list = mapper.readValue( s, new TypeReference<List<Item>>(){} );
    

    它只是消除了首先转换为 JsonNode 并直接转换为 List 的过程;仍然可以正常工作,输出项目列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-28
      • 1970-01-01
      • 2012-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多