将对象的地图解析为json

时间:2016-01-03 01:13:56

标签: json parsing jersey jackson

我读过无数关于将Java对象解析为JSON的文章,但仍有问题......

我知道那里有很多框架,这就是我猜的事情搞砸了。

我试图将地图解析为json:

Map<CategoryBean, Double> questionsPercentagePerCategory;

这里是CategoryBean的样子:

@XmlRootElement
public class CategoryBean implements Serializable{
    private static final long serialVersionUID = -7306680546426636719L;
    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

questionsPercentagePerCategory是包装器json中的一个变量,名为:PrePracticeBean

这就是它的样子:

@XmlRootElement
public class PrePracticeBean implements Serializable {
    private int maxQuestionsAllowedForUser;
    private int maxQuestionsAllowedForUserAfterCreditOver;
    private int questionsInExam;
    @XmlJavaTypeAdapter(XmlGenericMapAdapter.class)
    private Map<CategoryBean, Double> questionsPercentagePerCategory;
    private static final long serialVersionUID = -655358519739911024L;

    public int getMaxQuestionsAllowedForUser() {
        return maxQuestionsAllowedForUser;
    }

    public void setMaxQuestionsAllowedForUser(int maxQuestionsAllowedForUser) {
        this.maxQuestionsAllowedForUser = maxQuestionsAllowedForUser;
    }

    public int getMaxQuestionsAllowedForUserAfterCreditOver() {
        return maxQuestionsAllowedForUserAfterCreditOver;
    }

    public void setMaxQuestionsAllowedForUserAfterCreditOver(int maxQuestionsAllowedForUserAfterCreditOver) {
        this.maxQuestionsAllowedForUserAfterCreditOver = maxQuestionsAllowedForUserAfterCreditOver;
    }

    public int getQuestionsInExam() {
        return questionsInExam;
    }

    public void setQuestionsInExam(int questionsInExam) {
        this.questionsInExam = questionsInExam;
    }

    public Map<CategoryBean, Double> getQuestionsPercentagePerCategory() {
        return questionsPercentagePerCategory;
    }

    public void setQuestionsPercentagePerCategory(Map<CategoryBean, Double> questionsPercentagePerCategory) {
        this.questionsPercentagePerCategory = questionsPercentagePerCategory;
    }
}

正如您所看到的,我已使用@XmlRootElement注释标记了两个bean,以使Jeresey的OOB bean获得指定的here

的JSON解析功能

此外,这里是XMLGenericMapAdapter的样子:

public class XmlGenericMapAdapter<K, V> extends XmlAdapter<MapType<K, V>, Map<K, V>> {

    @Override
    public Map<K, V> unmarshal(MapType<K, V> orgMap) throws Exception {
        HashMap<K, V> map = new HashMap<K, V>();

        for (MapEntryType<K, V> mapEntryType : orgMap.getEntries()) {
            map.put(mapEntryType.getKey(), mapEntryType.getValue());
        }
        return map;
    }

    @Override
    public MapType<K, V> marshal(Map<K, V> v) throws Exception {
        MapType<K, V> mapType = new MapType<K, V>();

        for (Map.Entry<K, V> entry : v.entrySet()) {
            MapEntryType<K, V> mapEntryType = new MapEntryType<K, V>();
            mapEntryType.setKey(entry.getKey());
            mapEntryType.setValue(entry.getValue());
            mapType.getEntries().add(mapEntryType);
        }
        return mapType;
    }
}

好吧,最终的结果是让我疯狂的......它是间歇性的...当在调试模式下运行代码时,这可以完美地显示地图的嵌套json和每个键:值对是另一个嵌套的json。但是,当在运行模式下调用时,我得到一个丑陋的内存地址&#34;而不是CategoryBean键...

我唯一的猜测是,这与类加载有关,而且我可能正在使用其他一些JAR,它有一个类首先在调试模式下加载而不是在运行模式下...

无论如何,对于如何做到这一点的任何建议,将不胜感激。

感谢, GBA。

1 个答案:

答案 0 :(得分:0)

好吧,解决了......

一些JAXB /泽西的东西我直到最后都没有理解......但我敢打赌那里有一些JAXB大师可以给出正确的解释为什么会出现这种情况...

无论如何,底线是CategoryBean类不应该有注释@XmlRootElement,而应该有@XmlAccessorType(XmlAccessType.FIELD)

我从Serializer for (Hash)Maps for Jersey use?

获得灵感

感谢, GBA。