jaxb實現xml 和 json 之間的轉換
阿新 • • 發佈:2019-01-21
jaxb2 實體類轉xml:
public static String toXML(Object obj, String encode, boolean format, boolean fragment) {
try {
JAXBContext jaxbContext = JAXBContext.newInstance(obj.getClass());
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_ENCODING, encode); // 編碼格式
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, format); // 是否格式化生成的xml串
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, fragment); // 是否省略xm頭宣告資訊
StringWriter writer = new StringWriter();
marshaller.marshal(obj, writer);
return writer.toString();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
jaxb2 xml轉實體類:
public static <T> T fromXML(String xml, Class<T> valueType) {
try {
JAXBContext jaxbContext = JAXBContext.newInstance(valueType);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
return (T) unmarshaller.unmarshal(new StringReader(xml));
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
}
優化:
static Map<String, JAXBContext> jaxbContextMap = new HashMap<String, JAXBContext>();
/**
* java實體類轉xml
*/
public static String toXML(Object obj, String encode, boolean format, boolean fragment) {
try {
JAXBContext jaxbContext = jaxbContextMap.get(obj.getClass().getName());
if(jaxbContext == null){
// 如果每次都呼叫JAXBContext.newInstance方法,會導致效能急劇下降
jaxbContext = JAXBContext.newInstance(obj.getClass());
jaxbContextMap.put(obj.getClass().getName(), jaxbContext);
}
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_ENCODING, encode); // 編碼格式
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, format); // 是否格式化生成的xml串
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, fragment); // 是否省略xm頭宣告資訊
StringWriter writer = new StringWriter();
marshaller.marshal(obj, writer);
return writer.toString();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* xml轉java實體類
*/
@SuppressWarnings("unchecked")
public static <T> T fromXML(String xml, Class<T> valueType) {
try {
JAXBContext jaxbContext = jaxbContextMap.get(valueType.getName());
if(jaxbContext == null){
jaxbContext = JAXBContext.newInstance(valueType);
jaxbContextMap.put(valueType.getName(), jaxbContext);
}
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
return (T) unmarshaller.unmarshal(new StringReader(xml));
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
}