gpt4 book ai didi

json - 无法同时生成格式正确的 XML 和 JSON

转载 作者:数据小太阳 更新时间:2023-10-29 01:48:00 25 4
gpt4 key购买 nike

首先,在您决定结束我的问题之前,我试过 this解决方案,但它对我不起作用。

我有一个 REST 服务,它应该根据 Accept header 返回 JSONXML。我可以让它生成正确的 JSON,但不能生成 XML。当我修复 XML 时,JSON 被搞砸了。下面我将展示我的代码。

XML 似乎不错,但 JSON 不好

Message.java

import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElementRef;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Message {
int id;
String text;

@XmlElementWrapper
@XmlElementRef
List<Comment> comments;

public Message() {

}
// getters and setters
}

Comment.java

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "comment")
public class Comment {
int id;
String text;

public Comment() {

}
//getters and setters
}

MessageResource.java

import java.util.List;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;


@Path("messages")
public class MessageResource {

DBUtils db = new DBUtils();

@GET
@Produces(MediaType.APPLICATION_XML)
public Response getXML() {
List<Message> messages = db.getMessages();
return Response.ok(messages.toArray(new Message[messages.size()]), MediaType.APPLICATION_XML).build();
}

@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getJSON() {
List<Message> messages = db.getMessages();
return Response.ok(messages.toArray(new Message[messages.size()]), MediaType.APPLICATION_JSON).build();
}
}

这是 XML 结果,没问题:

<messages>
<message>
<id>1</id>
<text>Java is an OOP language.</text>
<comments>
<comment>
<id>20</id>
<text>That's correct.</text>
</comment>
<comment>
<id>30</id>
<text>test test</text>
</comment>
</comments>
</message>
<message>
<id>1</id>
<text>Java is an OOP language.</text>
<comments>
<comment>
<id>20</id>
<text>That's correct.</text>
</comment>
<comment>
<id>30</id>
<text>test test.</text>
</comment>
</comments>
</message>
</messages>

这里是JSON结果,注意注释。我只需要一个 comments 数组。

[
{
"id": 1,
"text": "Java is an OOP language.",
"comments": {
"comment": [
{
"id": 20,
"text": "That's correct."
},
{
"id": 30,
"text": "test test"
}
]
}
},
{
"id": 1,
"text": "Java is an OOP language.",
"comments": {
"comment": [
{
"id": 20,
"text": "That's correct."
},
{
"id": 30,
"text": "test test."
}
]
}
}
]

修复 JSON 会打乱 XML 响应

如果我从 Message 类中删除 @XmlElementWrapper@XmlElementRef 注释,那么它适用于 JSON,但不适用于 XML。

Message.jave

import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Message {
int id;
String text;

List<Comment> comments;

public Message() {

}
//getters and setters
}

CommentMessageResource 类保持不变。

这是我得到的结果:

JSON - 确定

[
{
"id": 1,
"text": "Java is an OOP language.",
"comments": [
{
"id": 20,
"text": "That's correct."
},
{
"id": 30,
"text": "test test"
}
]
},
{
"id": 1,
"text": "Java is an OOP language.",
"comments": [
{
"id": 20,
"text": "That's correct."
},
{
"id": 30,
"text": "test test."
}
]
}
]

XML - 错误

<messages>
<message>
<id>1</id>
<text>Java is an OOP language.</text>
<comments>
<id>20</id>
<text>That's correct.</text>
</comments>
<comments>
<id>30</id>
<text>test test</text>
</comments>
</message>
<message>
<id>1</id>
<text>Java is an OOP language.</text>
<comments>
<id>20</id>
<text>That's correct.</text>
</comments>
<comments>
<id>30</id>
<text>test test.</text>
</comments>
</message>
</messages>

有谁知道如何让这两个一起工作?我发现的唯一解决方案是将 JAXB 用于 XML,将 GSON 用于 JSON,但我必须使用 GSON 手动创建 JSON 对象。

谢谢!

最佳答案

我建议的解决方案使用 JAXB for XML(就像您一样)。但对于 JSON,它使用 Jackson-JAXRS(与您不同),如本 answer 中所述.因此,除了使用 GSON,您还需要使用 Jackson-JAXRS(例如来自 Maven )。

要获得所需的 XML 和 JSON 输出,您需要调整注释的 List<Comment> comments您的属性(property) Message类。

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Message {
int id;
String text;

@XmlElementWrapper(name="comments")
@XmlElementRef
@JsonUnwrapped
List<Comment> comments;

//getters and setters
}

通过 @XmlElementRef你得到每个 Comment写为 <comment> 的对象元素。最后,通过 @XmlElementWrapper(name="comments")你将所有这些包裹在 <comments> 中元素。

XML 输出是:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<messages>
<message>
<id>1</id>
<text>Java is an OOP language.</text>
<comments>
<comment>
<id>20</id>
<text>That's correct.</text>
</comment>
<comment>
<id>30</id>
<text>test test.</text>
</comment>
</comments>
</message>
<message>
<id>1</id>
<text>Java is an OOP language.</text>
<comments>
<comment>
<id>20</id>
<text>That's correct.</text>
</comment>
<comment>
<id>30</id>
<text>test test.</text>
</comment>
</comments>
</message>
</messages>

通过 @JsonUnwrapped (从包中导入 com.fasterxml.jackson.annotation )你得到 List<Comment> comments写成一个普通的对象数组。

JSON 输出为:

[
{
"id": 1,
"text": "Java is an OOP language.",
"comments": [
{
"id": 20,
"text": "That's correct."
},
{
"id": 30,
"text": "test test."
}
]
},
{
"id": 1,
"text": "Java is an OOP language.",
"comments": [
{
"id": 20,
"text": "That's correct."
},
{
"id": 30,
"text": "test test."
}
]
}
]

关于json - 无法同时生成格式正确的 XML 和 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43731279/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com