2016-06-22 36 views
1

Ich habe eine Hashmap<String, List<Object>> und ich möchte die Karte mit Jackson marshalieren. Es funktioniert mit JSON perfekt und sieht wie folgt aus:Marshalling hashmap mit Jackson zu XML - falsche Struktur

{ 
    "entriesByTable": { 
     "Karlsruhe": [ 
      { 
       "counts": 126, 
       "hashTag": "#Karlsruhe" 
      }, 
      { 
       "counts": 26, 
       "hashTag": "#jobs" 
      }, 
      { 
       "counts": 3, 
       "hashTag": "#etka16" 
      }, ... 

Aber wenn es meine Struktur kommt wie folgt aussieht XML:

<?xml version="1.0"?> 
<Database> 
    <entriesByTable> 
    <Karlsruhe> 
     <hashTag>#Karlsruhe</hashTag> 
     <counts>127</counts> 
    </Karlsruhe> 
    <Karlsruhe> 
     <hashTag>#jobs</hashTag> 
     <counts>27</counts> 
    </Karlsruhe> 
    <Karlsruhe> 
     <hashTag>#etka16</hashTag> 
     <counts>3</counts> 
    </Karlsruhe> ... 

Aber ich will/braucht den gleichen Json-strucutre:

<Database> 
<entriesByTable> (mapname) 
    <Karlsruhe>  (key) 
    <entries>  (value (list)) 
    <entry> 
    <counts>126</counts> 
    <hashTag>#Karlsruhe</hashtag> 
    </entry> 
    </entries> 
    </Karlsruhe> 
</entriesByTable> 
</Database> 

Meine Klasse:

@JacksonXmlRootElement 
public class Database { 

    private static String DATABASE_LOCATION; 

    @JsonProperty 
    private Map<String, List<DatabankEntry>> entriesByTable = new HashMap<>(); ... 

Zweite Klasse:

@JacksonXmlRootElement 
public class DatabankEntry implements Comparable<DatabankEntry> { 

    @JsonIgnore 
    private String tableName; 

    @JacksonXmlProperty 
    private String hashTag; 
    @JacksonXmlProperty 
    private int counts; 

Wäre toll, wenn jemand eine Idee hat. Vielleicht habe ich einen Fehler gemacht mit den Anmerkungen?

Antwort

0

Ok, ich habe das Problem selbst gelöst. Ich habe eine neue Klasse erstellt, die eine Liste von Einträgen enthält und das Listenobjekt mit Anmerkungen versehen hat.

@NoArgsConstructor 
public class DatabaseEntries { 

    @JacksonXmlProperty(localName="Entry") 
    @JacksonXmlElementWrapper(localName="Entries") 
    @JsonProperty 
    private List<DatabaseEntry> databaseEntries = new LinkedList<>(); 

    public int size(){ 
     return databaseEntries.size(); 
    } 

    @JsonIgnore 
    public List<DatabaseEntry> getAllEntries(){ 
     Collections.sort(databaseEntries); 
     return databaseEntries; 
    } 

    public void add(DatabaseEntry databaseEntry){ 
     databaseEntries.add(databaseEntry) ; 
     } 

} 

Mein HashMap sieht wie folgt nun Hashmap<String,Object>

@JsonProperty 
@JacksonXmlProperty(localName = "EntriesByTable") 
private Map<String, DatabaseEntries> entriesByTable = new HashMap<>(); 

und mein XML:

<?xml version="1.0"?> 
<Database> 
    <EntriesByTable> 
    <Karlsruhe> 
     <Entries> 
     <Entry> 
      <HashTag>#Karlsruhe</HashTag> 
      <Counts>700</Counts> 
     </Entry> 
     <Entry> 
      <HashTag>#Feuerwehr</HashTag> 
      <Counts>114</Counts> 
     </Entry> 
.... 

JSON:

{ 
    "entriesByTable": { 
     "Karlsruhe": { 
      "databaseEntries": [ 
       { 
        "counts": 700, 
        "hashTag": "#Karlsruhe" 
       }, 
       { 
        "counts": 114, 
        "hashTag": "#Feuerwehr" 
       },