我试图解组一些接收到的json(来自Jira Restful Web服务)。
问题是:“问题”具有“摘要”属性和字段列表。
摘要在接收的json中不是作为属性提供的,而是作为“ fields”属性的值提供的。我坚持要解组此结构:
@XmlRootElement
class Issue {
String summary;
List<Field> fields;
// getters/setters and lots of other fields
}
收到的JSON:
{
"expand":"html",
"self":"https://example.com/jira/rest/api/latest/issue/XYZ-1234",
"key":"XYZ-1234",
"fields":
{
"summary":
{
"name":"summary",
"type":"java.lang.String",
"value":"test 1234"
},
"customfield_10080":
{
"name":"Testeur",
"type":"com.atlassian.jira.plugin.system.customfieldtypes:userpicker"
},
"status":
{
"name":"status",
"type":"com.atlassian.jira.issue.status.Status",
"value":
{
"self":"https://example.com/jira/rest/api/latest/status/5",
"name":"Resolved"
}
},
...
},
"transitions":"https://example.com/jira/rest/api/latest/issue/XYZ-1234/transitions"
}
我不想使用Jira自己的客户端(我的应用程序中不需要太多的依赖项)。
编辑:我问了我的问题,另一种尝试使其清晰的方法:如何使用jax-rs将bean结构映射到其他模式
带注释的类 应该 是双射的:它 应该
允许生成从中解组出来的相同输入。如果仍然要使用非双目对象图,则可以使用@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>
问题内容: 我正在开发RESTful Web服务,并且在阅读Jersey 文档时遇到了一个注释 在我的Web服务中,我主要是根据作为参数提供的唯一键返回数据。当传递Student_Id时,将类推返回学生的所有信息。 所以我的问题是什么时候适合这种Web服务? 根据文档 如果在请求处理中多次使用资源,则将始终使用同一实例。 那么在那种情况下我们不应该费心使用权利吗? 还有什么用例,我们必须为每个请求
如何使用杰克逊序列化此类 Jackson没有拾取@XmlElementWrapper@XmlSee还有注释,Jackson也没有映射@XmlRootElement注释。我使用的是Jackson 1.9.0。Jackson正在将元素放入列表中,但没有映射POJO类的根元素。 这里是示例方法。 它生成的响应是'{“response”:{“status”:0,“PBBeans”:[{“user_name
问题内容: 和服务: 我的web.xml: 如果我将MediaType.APPLICATION_XML设置为Produces注释,则所有这些工作都可以进行。但是对于JSON,我得到以下异常: 严重:映射的响应异常:500(内部服务器错误)javax.ws.rs.WebApplicationException:com.sun.jersey.api.MessageException:Java类java
问题内容: 我一直在尝试创建Jersey REST Web服务。我想从Java类接收和发出JSON对象,如下所示: 应该这样将其转换为JSON: 但是,我找不到为此的标准解决方案。似乎每个人都在实现自己的包装器 解决方案。这个要求对我来说似乎是最基本的。我不敢相信这是普遍接受的解决方案,尤其是因为Jersey确实是Java中更有趣的部分之一。 我还尝试了升级到Jackson 1.8,这仅给了我这一
我正在尝试使用Spring 4实现REST服务。 该应用程序使用Java 7构建,并在Tomcat 7上运行。 REST方法将返回JSON格式的customer对象。应用程序是注释驱动的。 Customer类有JAXB注释。Jackson罐子出现在课堂路径中。据我所知,Jackson将使用JAXB注释生成JSON。 客户类别: 我已经将REST服务类注释为@RestController(根据Spr
问题内容: 我在代码中遇到问题。 当我在本地(http:// localhost:8080 / home / rest / parameter / )上运行应用程序时,出现以下错误。我的主要要求是在xml上的UI上显示所有信息。 org.jboss.resteasy.spi.UnhandledException:com.sun.xml.bind.v2.runtime.IllegalAnnotati