2014-02-10 2 views
1

Следующие программы маршалы и маркеры объединяют класс, содержащий поле Map<Integer, List<Integer>>.Как маршалить/размонтировать карту <Integer, List <Integer>>?

После размонтирования список на карте содержит строки, а не целые числа.

Есть ли простой способ гарантировать, что список будет заполнен целыми числами вместо строк при разборке?

import java.io.StringReader; 
import java.io.StringWriter; 
import java.util.Arrays; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 
import javax.xml.bind.Marshaller; 
import javax.xml.bind.Unmarshaller; 
import javax.xml.bind.annotation.XmlRootElement; 
import org.eclipse.persistence.jaxb.JAXBContextFactory; 
import org.eclipse.persistence.jaxb.MarshallerProperties; 
import org.eclipse.persistence.oxm.MediaType; 

public class MapApp { 

    @XmlRootElement 
    public static class Publication { 

     private String name; 

     private Map<Integer, List<Integer>> yearToIssues; 

     public void setName(String name) { 
      this.name = name; 
     } 

     public String getName() { 
      return name; 
     } 

     public void setYearToIssues(Map<Integer, List<Integer>> yearToIssues) { 
      this.yearToIssues = yearToIssues; 
     } 

     public Map<Integer, List<Integer>> getYearToIssues() { 
      return yearToIssues; 
     } 

    } 

    public static void main(String[] args) throws JAXBException { 
     Publication publication = new Publication(); 
     publication.setName("JAXB miracles"); 
     Map<Integer, List<Integer>> yearToIssues = new HashMap<>(); 
     yearToIssues.put(2013, Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)); 
     yearToIssues.put(2014, Arrays.asList(1, 2)); 
     publication.setYearToIssues(yearToIssues); 
     String marshalled = marshal(publication); 
     Publication uPublication = unmarshal(Publication.class, marshalled); 
     List<Integer> issues = uPublication.getYearToIssues().get(2013); 
     if (((Object) issues.get(0)) instanceof String) { 
      System.out.println("issue is instance of String!"); 
     } 

    } 

    static String marshal(Object toMarshal) throws JAXBException { 
     JAXBContext jc = JAXBContextFactory.createContext(new Class[] {toMarshal.getClass()}, null); 
     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, MediaType.APPLICATION_XML); 
     StringWriter sw = new StringWriter(); 
     marshaller.marshal(toMarshal, sw); 
     System.out.println(sw); 
     return sw.toString(); 
    } 

    static <T> T unmarshal(Class<T> entityClass, String str) throws JAXBException { 
     JAXBContext jc = JAXBContextFactory.createContext(new Class[] {entityClass}, null); 
     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     unmarshaller.setProperty(MarshallerProperties.MEDIA_TYPE, MediaType.APPLICATION_XML); 
     return (T) unmarshaller.unmarshal(new StringReader(str)); 
    } 

} 

ответ

2

Вы будете нуждаться, чтобы написать XmlAdapter для Map<Integer, List<Integer>>, чтобы правильно обращаться с этим случай использования.

+0

Thx, поэтому я реализовал XMLAdapter, сортировочная карту в строку и наоборот. Формат выглядит следующим образом: 2013: 1,2,3,4,5,6,7,8,9,10,11,12; 2014: 1,2 – user2867869

Смежные вопросы