带注释的类 应该 是双射的:它 应该
允许生成从中解组出来的相同输入。如果仍然要使用非双目对象图,则可以使用
@XmlAnyElement以下方式:
public class Issue { @XmlElement(required = true) protected Fields fields; public Fields getFields() { return fields; }}
在您提供的输入中,字段不是列表,而是字段(JSON使用[]分隔列表):
public class Fields { @XmlElement(required = true) protected Summary summary; @XmlAnyElement private List<Element> fields; public List<Element> getFields() { return fields; } public Summary getSummary() { return summary; }}
为了捕获Summary,您必须定义一个专用的类。其余字段将在
fields元素列表中分组。
public class Summary { @XmlAttribute protected String name; public String getName() { return name; }}
下面,使用您的输入进行的单元测试表明一切正常:
public class JaxbTest { @Test public void unmarshal() throws JAXBException, IOException { URL xmlUrl = Resources.getResource("json.txt"); InputStream stream = Resources.newInputStreamSupplier(xmlUrl).getInput(); Issue issue = parse(stream, Issue.class); assertEquals("summary", issue.getFields().getSummary().getName()); Element element = issue.getFields().getFields().get(0); assertEquals("customfield_10080", element.getTagName()); assertEquals("name", element.getFirstChild().getLocalName()); assertEquals("Testeur", element.getFirstChild().getFirstChild().getTextContent()); } private <T> T parse(InputStream stream, Class<T> clazz) throws JAXBException { JSonUnmarshaller unmarshaller = JsonContextNatural().createJSonUnmarshaller(); return unmarshaller.unmarshalFromJSON(stream, clazz); } private JSonJAXBContext JsonContextNatural() throws JAXBException { return new JSonJAXBContext(JSONConfiguration.natural().build(), Issue.class); }}
该测试表明,不使用专用类,您的代码将很快变得难以阅读。
您将需要那些maven依赖项来运行它:
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.8.2</version> <scope>test</scope></dependency><dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>r08</version></dependency><dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-json</artifactId> <version>1.6</version></dependency>
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)