How to marshal/unmarshal a Map<Integer, List<Integer>>?

谁都会走 提交于 2019-12-24 13:26:09

问题


The following program marshals and unmarshals a class containing a Map<Integer, List<Integer>> field.

After unmarshaling the list in the map contains strings and not integers.

Is there an easy way to ensure that the list will be filled with integers instead of strings during unmarshalling?

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));
    }

}

回答1:


You are going to need to write an XmlAdapter for Map<Integer, List<Integer>> to properly handle this use case.

  • http://blog.bdoughan.com/2010/07/xmladapter-jaxbs-secret-weapon.html


来源:https://stackoverflow.com/questions/21684854/how-to-marshal-unmarshal-a-mapinteger-listinteger

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!