【发布时间】:2018-08-24 23:47:22
【问题描述】:
我试图在 POST 请求中从 JSON 中提取参数。这似乎是一个非常基本的过程,我已经阅读了很多关于此的帖子,但我在这里遗漏了一些东西,因为我正在取回一个对象,但该对象中的字段为空。在我的 POST 中,我有以下 JSON...
{
"client": "1",
"forTopic": "topic"
}
这是我的 servlet 中的 POST 方法...
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
String requestBody = RESTUtil.getRequestBody (request);
log.debug (requestBody);
try
{
JAXBContext context = JAXBContext.newInstance (ClientAndTopicParameters.class);
Unmarshaller unmarshal = context.createUnmarshaller ();
unmarshal.setProperty (UnmarshallerProperties.MEDIA_TYPE, "application/json");
unmarshal.setProperty (UnmarshallerProperties.JSON_INCLUDE_ROOT, true);
ClientAndTopicParameters params = (ClientAndTopicParameters) unmarshal.unmarshal (new StreamSource (new StringReader (requestBody)), ClientAndTopicParameters.class).getValue ();
log.debug ("params = " + params);
log.debug ("client = " + params.client);
log.debug ("forTopic = " + params.forTopic);
}
catch (JAXBException e)
{
log.error ("Unable to get Client and Topic parameters from POST.", e);
}
}
最后,这是我的 ClientAndTopicParameters 类...
@XmlRootElement
public class ClientAndTopicParameters
{
@XmlElement public String client;
@XmlElement public String forTopic;
}
结果输出如下...
2018 Aug 24 17:44:55,806 DEBUG [MyServlet ] params = mypackage.ClientAndTopicParameters@2995a298
2018 Aug 24 17:44:55,806 DEBUG [MyServlet ] client = null
2018 Aug 24 17:44:55,806 DEBUG [MyServlet ] forTopic = null
如您所见,这是非常基本的东西。我假设我错过了一些我只是没有看到的小东西。欢迎任何想法和见解。作为参考,我使用的是 JAXB v2.3.0
【问题讨论】:
-
JAXB 用于编组/解组 XML 文件,而不是用于读取 JSON 内容。你应该使用 Jackson、Gson 或其他东西来阅读你的 pojo。 Here 您可以在签入您想用来解析请求正文的正确技术后生成您的 pojo,使用此生成的 POJO,您的 JSON 肯定会被 Jackson/Gson 读取。
-
我不确定这是否正确 m4gic。我正在使用 JAXB 为我的其他对象编组和解组 JSON。因此 unmarshal.setProperty (UnmarshallerProperties.MEDIA_TYPE, "application/json");唯一的区别是在这种情况下我没有指定 XMLRoolElement。通常我有@XmlRoolElement (name="MyObject")。但在这种情况下,这里的 JSON 是对象,而不是 JSON 中指定的对象。例如... {"MyObject":{JSON DATA...}}。相反,我有 {JSON DATA...}。所以我猜我正在寻找如何指定此 JSON 用于我的对象 ClientAndTopicParameters。
-
嗨,是的,我不知道jaxb can handle this。因此,如果您使用一些额外的技术,例如 Jackson 或 Moxy,似乎可以使用 JAXB 编组/解组 JSON ......这些额外的技术可以自己处理 JSON,对我来说,单独使用 Jackson 会更清楚(作为本机JSON解析器/序列化器)比以这种方式使用JAXB。我认为杰克逊在这方面要好得多。使用 XML 注释来注释 POJO 以进行 JSON 处理对我来说是令人困惑的。
-
您应该在问题中添加您使用的是什么 jaxb 版本,这将有助于重现您的问题。
-
谢谢@m4gic。好点,我会添加版本。另外,我选择了 JAXB,以便它处理我正在使用的 JPA 实体。我承认虽然我没有研究过杰克逊。我一定会看看的。