有点迷路……杰克逊反序列化
A bit lost... Jackson deserialization
我一直在与 Jackson 合作反序列化数据。总的来说,这是一个顺利的过程。
让我感到困惑的是,当 JSON 属性缺少名称时,试图将具有已知数量对象的对象反序列化为自定义 class。
总的来说,我正在反序列化 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;
...
}
我在这里和其他情况下一直遇到的问题是将没有名称的对象列表(即没有 "name:value" 只是 "value")映射到指定的 class .
"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());
}
我不需要完整的解决方案。我只需要走上正确的轨道。
感谢您的宝贵时间!
如果各个项目不使用名称值对,那么您需要编写某种自定义反序列化程序来理解数组偏移量之间的关系:
[0, "all", [0]]
并将它们映射到 AnkiNoteTypeReq
中的属性。我知道 Jackson 中有一种机制,您可以在其中指定应使用自定义 class 反序列化给定类型,但我不记得确切的语法。作为第一步,我将使用 Jackson 将 JSON 字符串反序列化为 JsonNode 并通过创建类似
的函数进行手动反序列化
static AnkiNoteTypeReq fromJsonNode(JsonNode node) {
...
}
您可以使用 http://fasterxml.github.io/jackson-annotations/javadoc/2.5/com/fasterxml/jackson/annotation/JsonFormat.Shape.html 要求 Jackson 直接映射到一个数组。在这种模式下,jackson 需要你注释属性的顺序,并从一个 json 数组映射到一个对象。
我一直在与 Jackson 合作反序列化数据。总的来说,这是一个顺利的过程。
让我感到困惑的是,当 JSON 属性缺少名称时,试图将具有已知数量对象的对象反序列化为自定义 class。
总的来说,我正在反序列化 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;
...
}
我在这里和其他情况下一直遇到的问题是将没有名称的对象列表(即没有 "name:value" 只是 "value")映射到指定的 class .
"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());
}
我不需要完整的解决方案。我只需要走上正确的轨道。
感谢您的宝贵时间!
如果各个项目不使用名称值对,那么您需要编写某种自定义反序列化程序来理解数组偏移量之间的关系:
[0, "all", [0]]
并将它们映射到 AnkiNoteTypeReq
中的属性。我知道 Jackson 中有一种机制,您可以在其中指定应使用自定义 class 反序列化给定类型,但我不记得确切的语法。作为第一步,我将使用 Jackson 将 JSON 字符串反序列化为 JsonNode 并通过创建类似
static AnkiNoteTypeReq fromJsonNode(JsonNode node) {
...
}
您可以使用 http://fasterxml.github.io/jackson-annotations/javadoc/2.5/com/fasterxml/jackson/annotation/JsonFormat.Shape.html 要求 Jackson 直接映射到一个数组。在这种模式下,jackson 需要你注释属性的顺序,并从一个 json 数组映射到一个对象。