【问题标题】:A bit lost... Jackson deserialization有点失落……杰克逊反序列化
【发布时间】:2015-01-24 00:33:11
【问题描述】:

我一直在与 Jackson 合作反序列化数据。总的来说,这是一个顺利的过程。

让我感到困惑的是,当 JSON 属性缺少名称时,试图将具有已知数量对象的东西反序列化为自定义类。

总的来说,我正在反序列化 objectId:fullObject 的映射

{
"1411842351335": {"vers": [], "name": "Basic (and reversed card)", "tags": [], "did": 1, "usn": -1, "req": [[0, "all", [0]], [1, "all", [1]]], "flds": [{"size": 20, "name": "Front", "media": [], "rtl": false, "ord": 0, "font": "Arial", "sticky": false}, {"size": 20, "name": "Back", "media": [], "rtl": false, "ord": 1, "font": "Arial", "sticky": false}], "sortf": 0, "latexPre": "\\documentclass[12pt]{article}\n\\special{papersize=3in,5in}\n\\usepackage[utf8]{inputenc}\n\\usepackage{amssymb,amsmath}\n\\pagestyle{empty}\n\\setlength{\\parindent}{0in}\n\\begin{document}\n", "tmpls": [{"afmt": "{{FrontSide}}\n\n<hr id=answer>\n\n{{Back}}", "name": "Card 1", "qfmt": "{{Front}}", "did": null, "ord": 0, "bafmt": "", "bqfmt": ""}, {"afmt": "{{FrontSide}}\n\n<hr id=answer>\n\n{{Front}}", "name": "Card 2", "qfmt": "{{Back}}", "did": null, "ord": 1, "bafmt": "", "bqfmt": ""}], "latexPost": "\\end{document}", "type": 0, "id": "1411842351335", "css": ".card {\n font-family: arial;\n font-size: 20px;\n text-align: center;\n color: black;\n background-color: white;\n}\n", "mod": 1411842351}}

每个对象都被映射到一个class,其一般结构如下:

public class AnkiNoteType {
    ...
    private List<AnkiNoteTypeReq> req;
    ...
}

有问题的对象

package com.openwebsrs.libanki.entities;    
public class AnkiNoteTypeReq {
        ...
        private Integer a;
        private String b;
        private List<Integer> c;
        ...
    }

我在这里和其他情况下遇到的问题是将没有名称的对象列表(即没有“名称:值”,只有“值”)映射到指定的类。

"req": [[0, "all", [0]], [1, "all", [1]]]

我一直在做的事情可以在here in implementation 看到,重要的部分如下:

@Override
public List<AnkiNoteType> getAnkiNoteTypes(String noteTypesString) throws IOException {
    Map<Long, AnkiNoteType> noteTypeMap = objectMapper.readValue(noteTypesString, new TypeReference<Map<Long, AnkiNoteType>>() {
    });
    return new ArrayList(noteTypeMap.values());
}

我不需要完整的解决方案。我只需要走上正轨。

感谢您的宝贵时间!

【问题讨论】:

  • 你对json的格式有任何控制吗?如果是这样,我强烈建议您选择将“req”表示为对象数组而不是数组数组(实际上是对象)。这不仅可以解决您当前的问题,还可以解决您将来可能遇到的任何问题,如果此 json 表示扩展为使字段不明确。
  • 不幸的是,没有。数据直接从另一个应用程序的数据库中提取 (ankisrs.net)。不过欣赏这个想法!

标签: java json jackson deserialization


【解决方案1】:

您也许可以使用http://fasterxml.github.io/jackson-annotations/javadoc/2.5/com/fasterxml/jackson/annotation/JsonFormat.Shape.html 让Jackson 直接映射到一个数组。在此模式下,jackson 要求您对属性的顺序进行注释,并从 json 数组映射到对象。

【讨论】:

  • 感谢您的创意!将不得不尝试使用 JsonNode 进行基于订单的反序列化和手动反序列化,并找出最佳性能。
【解决方案2】:

如果单个项目不使用名称值对,那么您需要编写某种自定义反序列化器来理解以下数组偏移之间的关系:

[0, "all", [0]]

并将它们映射到AnkiNoteTypeReq 中的属性。我知道 Jackson 中有一种机制,您可以在其中指定应使用自定义类对给定类型进行反序列化,但我不记得确切的语法。作为第一遍,我将使用 Jackson 将 JSON 字符串反序列化为 JsonNode 并通过创建类似

的函数进行手动反序列化
static AnkiNoteTypeReq fromJsonNode(JsonNode node) {
   ...
}

【讨论】:

  • 感谢您的指导!将研究使用 JsonNode 手动反序列化。
猜你喜欢
  • 2015-04-07
  • 1970-01-01
  • 2018-07-21
  • 1970-01-01
  • 2012-11-19
  • 2016-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多