我正在尝试编写一种使用MOXy的方法来美化JSON字符串的方法。所以我想要一个像这样的方法:
我认为最好的方法是将字符串解析为通用对象(类似于SAX文档或类似的对象),然后使用一些格式属性将此对象转换回JSON(这不是问题)。
问题在于,当读取JSON字符串输入时,我没有要解组的类(因为我希望该方法尽可能通用)。
我尝试过这个:
现在,我将使用以下代码(Martin Vojtek)来尝试格式化文本。
public String formatJson(String input) { ... }
我认为最好的方法是将字符串解析为通用对象(类似于SAX文档或类似的对象),然后使用一些格式属性将此对象转换回JSON(这不是问题)。
问题在于,当读取JSON字符串输入时,我没有要解组的类(因为我希望该方法尽可能通用)。
我尝试过这个:
public static String toFormattedJson(final String jsonString) {
String formatted;
try {
JAXBContext jaxbContext = JAXBContextFactory.createContext(new Class[] { JAXBElement.class }, null);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
unmarshaller.setProperty(MEDIA_TYPE, MediaType.APPLICATION_JSON);
unmarshaller.setProperty(JSON_INCLUDE_ROOT, true);
StringReader reader = new StringReader(jsonString);
Object element = unmarshaller.unmarshal(reader); // Exception is thrown here
formatted = toFormattedJson(element);
} catch (final JAXBException e) {
formatted = jsonString;
}
return formatted;
}
但我遇到了这个异常:
javax.xml.bind.UnmarshalException - 带有链接异常: [java.lang.ClassCastException:org.eclipse.persistence.internal.oxm.record.SAXUnmarshallerHandler无法转换为org.eclipse.persistence.internal.oxm.record.UnmarshalRecord]
那么如果我没有特定字符串的任何类,如何将任意JSON字符串读取到Java对象中?
更新: 这是用于将对象格式化为JSON字符串的方法:
private static String toFormattedJson(Object obj) {
String result;
try (StringWriter writer = new StringWriter()) {
final JAXBContext jaxbContext = JAXBContextFactory.createContext(new Class[] { obj.getClass() }, null);
final Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(JAXBContextProperties.MEDIA_TYPE, MediaType.APPLICATION_JSON);
marshaller.setProperty(MarshallerProperties.JSON_REDUCE_ANY_ARRAYS, false);
marshaller.setProperty(MarshallerProperties.JSON_MARSHAL_EMPTY_COLLECTIONS, false);
marshaller.setProperty(JAXBContextProperties.JSON_WRAPPER_AS_ARRAY_NAME, false);
marshaller.setProperty(JAXBContextProperties.JSON_INCLUDE_ROOT, true);
marshaller.marshal(obj, writer);
writer.flush();
result = writer.toString();
} catch (JAXBException | IOException e) {
result = obj.toString();
}
return result;
}
现在,我将使用以下代码(Martin Vojtek)来尝试格式化文本。
String jsonString = "{\"p\" : [ 1, 2, 3]}";
I get:
{
"p" : "1"
}