2015-01-24 2 views
3

저는 데이터를 비 직렬화하기 위해 잭슨과 협력 해 왔습니다. 일반적으로 부드러운 프로세스였습니다.약간의 손실 ... 잭슨의 비 직렬화

나를 괴롭 히게 한 것은 JSON 속성에 이름이 없을 때 알려진 양의 객체가있는 클래스를 사용자 정의 클래스로 deserialize하려고하는 것입니다. fullObject 각 객체는 다음과 일반 구조의 class에 매핑됩니다

{ 
"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}} 

:

전반적인 결과를 보면, OBJECTID의지도 역 직렬화하고있어

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"가 아님)을 지정된 클래스에 매핑합니다. 내가 해왔 무엇

"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

json의 형식을 제어 할 수 있습니까? 그렇다면 배열의 배열 (실제로는 객체) 대신 "req"를 배열로 선택하는 것이 좋습니다. 이 방법은 현재의 문제를 해결할뿐만 아니라 필드가 모호해 지도록이 json 표현을 확장해야하는 미래의 문제를 해결합니다. – hofan41

+0

불행히도, 아니오. 데이터는 다른 응용 프로그램 (http://ankisrs.net/)의 데이터베이스에서 직접 가져옵니다. 생각을 경탄하십시오! – user3581961

답변

1

같은 기능을 작성하여 JsonNode에 JSON 문자열을 역 직렬화 및 수동 역 직렬화 할 잭슨을 사용합니다. 이 모드에서 jackson은 속성의 순서에 주석을 달고 json 배열에서 객체로 매핑해야합니다.

+0

아이디어를 제공해 주셔서 감사합니다. JsonNode를 사용하여 주문 기반 비 직렬화 및 수동 비 직렬화를 시도하고 최상의 성능을 파악해야합니다. – user3581961

0

이름 값 쌍을 사용하지 않는 개별 항목에, 당신은이에 배열 오프셋 사이의 관계를 이해하고 사용자 정의 디시리얼라이저의 일종 작성해야하는 경우 :

[0, "all", [0]] 

을 그리고 그들을지도 AnkiNoteTypeReq의 속성 특정 유형이 사용자 정의 클래스를 사용하여 직렬화되어야한다고 지정할 수있는 Jackson의 메커니즘이 있음을 알고 있지만 정확한 구문을 기억하지 못합니다. 첫 번째 패스로 나는 당신이 배열에 직접 매핑 잭슨에게 물어 http://fasterxml.github.io/jackson-annotations/javadoc/2.5/com/fasterxml/jackson/annotation/JsonFormat.Shape.html을 사용할 수 있습니다

static AnkiNoteTypeReq fromJsonNode(JsonNode node) { 
    ... 
} 
+0

안내해 주셔서 감사합니다! JsonNode로 수동으로 비 직렬화에 대해 연구 할 것입니다. – user3581961