java - 读取 JSON 以使用 JAX-RS 进行映射

标签 java json rest glassfish jax-rs

我正在编写一个 Java EE REST 应用程序(它在 Glassfish 4.1 下运行),但在读取简单的键值 JSON 列表时遇到问题。我正在尝试使用 POJO 类生成和使用 JSON,生成工作正常,但使用不起作用。 让我们来看代码。我用于生成和使用 JSON 的 POJO 类如下所示:

public class Transport {
  protected Integer id;
  protected String name;
  protected Map<String, String> fields;
  // ...getters and setters...
}

REST 资源导入这些库(我已将相关库放在这里):

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import org.glassfish.jersey.media.multipart.FormDataParam;

生成 JSON 的方法工作正常,如下:

@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("test")
public Response testGet() {
  Transport sct = new Transport();
  sct.setId(1);
  sct.setName("test");
  HashMap<String, String> t1 = new HashMap();
  t1.put("aaa", "bbb");
  t1.put("bbb", "ccc");
  t1.put("ccc", "ddd");
  sct.setFields(t1);
  // createOkResponse is a class method that return Response type
  return createOkResponse(sct);
}

所以我正确地获得了这个输出:

{
  "id": 1,
  "name": "test",
  "fields": {
     "aaa": "bbb",
     "ccc": "ddd",
     "bbb": "ccc"
  }
}

使用相同 POJO 的 JSON 方法:

@PUT
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Path("test")
public Response testPut(Transport sct) {
  Map<String, String> fields = sct.getFields();
  // this code throws a NullPointerException at fields.entrySet() 
  // because fields is always null
  //for (Entry<String, String> field : fields.entrySet()) {
  //  LOG.log(Level.INFO, "*** field: {0} = {1}", new Object[]{field.getKey(), field.getValue()});
  //}
  return createOkResponse(sct);
}

使用上面相同的 JSON 来使用服务将产生一个设置了 id 和 name 属性的 sct 对象,但 fields 属性为 null,因此该方法的响应是:

{
  "id": 1,
  "name": "test",
  "fields": null
}

这就像 {"aaa": "bbb", "ccc": "ddd", "bbb": "ccc"} JSON 对象被忽略。我尝试用谷歌搜索,但我不明白我的代码出了什么问题,而且我在 glassfish 日志中没有看到任何错误或警告。 任何想法?谢谢。

最佳答案

您可以使用 XmlAdapter,如 this post 中所述。 。问题在于 MOXy 处理 map 的方式。它在底层使用了 JAXB,而 JAXB 本来是用于 XML 的,而 XML 不能很好地映射到 Map(或键/值)对。

出于这个原因,我建议使用 Jackson,而不是使用 MOXy for JSON(这是 Glassfish 中的默认 JSON 提供程序)。 Jackson 也应该包含在 Glassfish 4.1 中。但您需要禁用 MOXy,以便 Jackson 可以自行注册。要禁用 MOXy,只需设置 Jersey 属性 jersey.config.server.disableMoxyJsontrue

关于java - 读取 JSON 以使用 JAX-RS 进行映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37692569/

相关文章:

json - R解析字符串

javascript - 如何在 javascript 中使用 PHP 数组或 json 响应?

java - 如何使用 jersey 客户端使用 https RestFul Webservice

java - 无法通过 Java 发送电子邮件

java - 让 Netbeans 和 Subversion 与库很好地协同工作?

java - Log4j2 创建日志文件但不写入它

ios - 如何通过 iOS 中的 json 链接打开在模拟器或设备中可用但在应用商店中不可用的应用程序?

spring - Swagger codegen - 更改 api 和 Controller 类名称

node.js - 单页应用程序 + node.js 后端 (REST) + CMS - 最佳概念/实践

java - Java 中的 PKCS5_PBKDF2_HMAC_SHA1