我读过无数关于将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。
答案 0 :(得分:0)
好吧,解决了......
一些JAXB /泽西的东西我直到最后都没有理解......但我敢打赌那里有一些JAXB大师可以给出正确的解释为什么会出现这种情况...
无论如何,底线是CategoryBean类不应该有注释@XmlRootElement,而应该有@XmlAccessorType(XmlAccessType.FIELD)
我从Serializer for (Hash)Maps for Jersey use?
获得灵感感谢, GBA。