简体   繁体   English

如何封送/解封地图 <Integer, List<Integer> &gt;?

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

The following program marshals and unmarshals a class containing a Map<Integer, List<Integer>> field. 下面的程序将编组和解组包含Map<Integer, List<Integer>>字段的类。

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

}

You are going to need to write an XmlAdapter for Map<Integer, List<Integer>> to properly handle this use case. 您将需要为Map<Integer, List<Integer>>编写一个XmlAdapter以正确处理此用例。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM