JAXB 映射 将复杂对象映射到 JSON
JAXB mapping Map with complex object to JSON
我在序列化到 JSON 我的复杂对象时遇到问题,该对象包含带有另一个复杂对象的 Map。我正在使用 JAXB 和 MOXy。这是我的 classes:
我想要的根 class serialize/deserialize:
@XmlRootElement
@XmlSeeAlso(ComplexBean.class)
@XmlAccessorType(XmlAccessType.FIELD)
public class MapBean implements Serializable {
@XmlJavaTypeAdapter(MapAdapter.class)
@XmlElement
private Map<String, ComplexBean> complexBeans;
我的ComplexBean class(省略getters/setters):
public class ComplexBean implements Serializable {
private String name;
private String surName;
private double weight;
地图适配器class:
public class MapAdapter extends XmlAdapter<Element, Map<String, ComplexBean>> {
private DocumentBuilder documentBuilder;
public MapAdapter() throws Exception {
documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
}
public Element marshal(Map<String, ComplexBean> map) throws Exception {
Document document = documentBuilder.newDocument();
Element rootElement = document.createElement("complexBeans");
document.appendChild(rootElement);
for(Map.Entry<String, ComplexBean> entry : map.entrySet()) {
Element childElement = document.createElement(entry.getKey());
ComplexBean complexBean = entry.getValue();
Attr nameAttribute = document.createAttribute("name");
nameAttribute.setValue(complexBean.getName());
childElement.setAttributeNode(nameAttribute);
Attr surNameAttribute = document.createAttribute("surName");
surNameAttribute.setValue(complexBean.getSurName());
childElement.setAttributeNode(surNameAttribute);
Attr weightAttribute = document.createAttribute("weight");
weightAttribute.setValue(String.valueOf(complexBean.getWeight()));
childElement.setAttributeNode(weightAttribute);
rootElement.appendChild(childElement);
}
return rootElement;
}
public Map<String, ComplexBean> unmarshal(Element element) throws Exception {
System.out.println("In unmarshaller");
Map<String, ComplexBean> complexBeans = new HashMap<String, ComplexBean>();
return null;
}
}
我的主要方法:
public static void main(String[] args) throws Exception {
Map<String, Object> jaxbProperties = new HashMap<String, Object>();
jaxbProperties.put(JAXBContextProperties.MEDIA_TYPE, MediaType.APPLICATION_JSON);
jaxbProperties.put(JAXBContextProperties.JSON_INCLUDE_ROOT, false);
javax.xml.bind.JAXBContext jc = JAXBContext.newInstance(new Class[] {MapBean.class}, jaxbProperties);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
MapBean mapBean = getMapBean();
Writer writer = new StringWriter();
marshaller.marshal(mapBean, writer);
String json = writer.toString();
System.out.println("Output JSON: ");
System.out.println(json);
StreamSource streamSource = new StreamSource(json);
Unmarshaller unmarshaller = jc.createUnmarshaller();
MapBean unmarshalledMapBean = unmarshaller.unmarshal(streamSource, MapBean.class).getValue();
System.out.println(unmarshalledMapBean);
}
所以,当我 运行 我的主要方法时,编组器 returns 这样 json:
{
"complexBeans" : {
"first" : {
"name" : "cbName1",
"surName" : "cbSurName1",
"weight" : "50.5"
},
"second" : {
"name" : "cbName2",
"surName" : "cbSurName2",
"weight" : "10.5"
}
}
}
但是 umarshaller 没有调用 MapAdapter 中的 unmarshall 方法 class 并且失败并出现异常:
Caused by: Exception [EclipseLink-25004] (Eclipse Persistence Services - 2.6.1.v20150916-55dc7c3): org.eclipse.persistence.exceptions.XMLMarshalException
Exception Description: An error occurred unmarshalling the document
Internal Exception: java.net.MalformedURLException: no protocol: {
"complexBeans" : {
"first" : {
"name" : "cbName1",
"surName" : "cbSurName1",
"weight" : "50.5"
},
"second" : {
"name" : "cbName2",
"surName" : "cbSurName2",
"weight" : "10.5"
}
}
}
at org.eclipse.persistence.exceptions.XMLMarshalException.unmarshalException(XMLMarshalException.java:120)
at org.eclipse.persistence.internal.oxm.record.json.JsonStructureReader.parse(JsonStructureReader.java:156)
at org.eclipse.persistence.internal.oxm.record.SAXUnmarshaller.unmarshal(SAXUnmarshaller.java:863)
at org.eclipse.persistence.internal.oxm.record.SAXUnmarshaller.unmarshal(SAXUnmarshaller.java:710)
at org.eclipse.persistence.internal.oxm.XMLUnmarshaller.unmarshal(XMLUnmarshaller.java:643)
at org.eclipse.persistence.jaxb.JAXBUnmarshaller.unmarshal(JAXBUnmarshaller.java:339)
... 1 more
at java.net.URL.<init>(URL.java:586)
at java.net.URL.<init>(URL.java:483)
at java.net.URL.<init>(URL.java:432)
at org.eclipse.persistence.internal.oxm.record.json.JsonStructureReader.parse(JsonStructureReader.java:127)
at org.eclipse.persistence.internal.oxm.record.json.JsonStructureReader.parse(JsonStructureReader.java:154)
... 5 more
所以,请帮助我将 json 解组为 MapBean 对象。我的错误是什么?
您的 StreamSource
调用在 main method.You 中是错误的,直接将 json 字符串传递给 StreamSource 构造函数。
这是您目前拥有的--
StreamSource streamSource = new StreamSource(String json);
,您应该有如下内容
StreamSource streamSource = new StreamSource("file location/URL");
或
StreamSource streamSource = new StreamSource(File);
我在序列化到 JSON 我的复杂对象时遇到问题,该对象包含带有另一个复杂对象的 Map。我正在使用 JAXB 和 MOXy。这是我的 classes: 我想要的根 class serialize/deserialize:
@XmlRootElement
@XmlSeeAlso(ComplexBean.class)
@XmlAccessorType(XmlAccessType.FIELD)
public class MapBean implements Serializable {
@XmlJavaTypeAdapter(MapAdapter.class)
@XmlElement
private Map<String, ComplexBean> complexBeans;
我的ComplexBean class(省略getters/setters):
public class ComplexBean implements Serializable {
private String name;
private String surName;
private double weight;
地图适配器class:
public class MapAdapter extends XmlAdapter<Element, Map<String, ComplexBean>> {
private DocumentBuilder documentBuilder;
public MapAdapter() throws Exception {
documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
}
public Element marshal(Map<String, ComplexBean> map) throws Exception {
Document document = documentBuilder.newDocument();
Element rootElement = document.createElement("complexBeans");
document.appendChild(rootElement);
for(Map.Entry<String, ComplexBean> entry : map.entrySet()) {
Element childElement = document.createElement(entry.getKey());
ComplexBean complexBean = entry.getValue();
Attr nameAttribute = document.createAttribute("name");
nameAttribute.setValue(complexBean.getName());
childElement.setAttributeNode(nameAttribute);
Attr surNameAttribute = document.createAttribute("surName");
surNameAttribute.setValue(complexBean.getSurName());
childElement.setAttributeNode(surNameAttribute);
Attr weightAttribute = document.createAttribute("weight");
weightAttribute.setValue(String.valueOf(complexBean.getWeight()));
childElement.setAttributeNode(weightAttribute);
rootElement.appendChild(childElement);
}
return rootElement;
}
public Map<String, ComplexBean> unmarshal(Element element) throws Exception {
System.out.println("In unmarshaller");
Map<String, ComplexBean> complexBeans = new HashMap<String, ComplexBean>();
return null;
}
}
我的主要方法:
public static void main(String[] args) throws Exception {
Map<String, Object> jaxbProperties = new HashMap<String, Object>();
jaxbProperties.put(JAXBContextProperties.MEDIA_TYPE, MediaType.APPLICATION_JSON);
jaxbProperties.put(JAXBContextProperties.JSON_INCLUDE_ROOT, false);
javax.xml.bind.JAXBContext jc = JAXBContext.newInstance(new Class[] {MapBean.class}, jaxbProperties);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
MapBean mapBean = getMapBean();
Writer writer = new StringWriter();
marshaller.marshal(mapBean, writer);
String json = writer.toString();
System.out.println("Output JSON: ");
System.out.println(json);
StreamSource streamSource = new StreamSource(json);
Unmarshaller unmarshaller = jc.createUnmarshaller();
MapBean unmarshalledMapBean = unmarshaller.unmarshal(streamSource, MapBean.class).getValue();
System.out.println(unmarshalledMapBean);
}
所以,当我 运行 我的主要方法时,编组器 returns 这样 json:
{
"complexBeans" : {
"first" : {
"name" : "cbName1",
"surName" : "cbSurName1",
"weight" : "50.5"
},
"second" : {
"name" : "cbName2",
"surName" : "cbSurName2",
"weight" : "10.5"
}
}
}
但是 umarshaller 没有调用 MapAdapter 中的 unmarshall 方法 class 并且失败并出现异常:
Caused by: Exception [EclipseLink-25004] (Eclipse Persistence Services - 2.6.1.v20150916-55dc7c3): org.eclipse.persistence.exceptions.XMLMarshalException
Exception Description: An error occurred unmarshalling the document
Internal Exception: java.net.MalformedURLException: no protocol: {
"complexBeans" : {
"first" : {
"name" : "cbName1",
"surName" : "cbSurName1",
"weight" : "50.5"
},
"second" : {
"name" : "cbName2",
"surName" : "cbSurName2",
"weight" : "10.5"
}
}
}
at org.eclipse.persistence.exceptions.XMLMarshalException.unmarshalException(XMLMarshalException.java:120)
at org.eclipse.persistence.internal.oxm.record.json.JsonStructureReader.parse(JsonStructureReader.java:156)
at org.eclipse.persistence.internal.oxm.record.SAXUnmarshaller.unmarshal(SAXUnmarshaller.java:863)
at org.eclipse.persistence.internal.oxm.record.SAXUnmarshaller.unmarshal(SAXUnmarshaller.java:710)
at org.eclipse.persistence.internal.oxm.XMLUnmarshaller.unmarshal(XMLUnmarshaller.java:643)
at org.eclipse.persistence.jaxb.JAXBUnmarshaller.unmarshal(JAXBUnmarshaller.java:339)
... 1 more
at java.net.URL.<init>(URL.java:586)
at java.net.URL.<init>(URL.java:483)
at java.net.URL.<init>(URL.java:432)
at org.eclipse.persistence.internal.oxm.record.json.JsonStructureReader.parse(JsonStructureReader.java:127)
at org.eclipse.persistence.internal.oxm.record.json.JsonStructureReader.parse(JsonStructureReader.java:154)
... 5 more
所以,请帮助我将 json 解组为 MapBean 对象。我的错误是什么?
您的 StreamSource
调用在 main method.You 中是错误的,直接将 json 字符串传递给 StreamSource 构造函数。
这是您目前拥有的--
StreamSource streamSource = new StreamSource(String json);
,您应该有如下内容
StreamSource streamSource = new StreamSource("file location/URL");
或
StreamSource streamSource = new StreamSource(File);