【问题标题】:JAX-RS unmarshal JSON sub property to hash mapJAX-RS 将 JSON 子属性解组为哈希映射
【发布时间】:2016-08-29 14:44:19
【问题描述】:

我有一个接受以下格式的 JSON 的 REST 服务端点:

{
  "name": "example",
  "properties": {
    "key1": "val1",
    "key2": "val2"
  }
}

那我有这门课

class Document {
  private String name;

  private Map<String, String> properties;

  ... setters/getters
}

还有我的 REST 服务方法

logger = Logger.getLogger("logger");

@POST
@Consumes(MediaType.APPLICATION_JSON)
Response addDocument(Document document) {
  logger.info(document);
  return Response.ok(200).build();
}

但每当我在上面发布 JSON 时,它并没有解组我的属性。它始终为空。 name 属性映射正确..

我很乐意接受任何帮助/线索。谢谢!

编辑:我没有提到我正在使用 glassfish 4.1 以及它附带的内容。我对 marshal/unmarshal 没有任何 lib 依赖项。

【问题讨论】:

  • 您使用哪个库将 POJO 转换为 JSON,反之亦然
  • 不使用任何特定的库。使用 glassfish 并使用 OOB 附带的任何内容。我已将我的应用程序限制为非常灵活且可部署在任何 EE 投诉容器中。目前通过 docker 使用 glassfish 4.1
  • 你能发布你的 web.xml 吗?确保您已将 com.sun.jersey.api.json.POJOMappingFeature 添加为 true
  • 我将使用 init-param 进行测试并让您知道。但事实证明我错过了那个。
  • 我尝试了 init-param,没有任何改变.. 属性仍然为空

标签: java json jax-rs


【解决方案1】:

我刚刚添加了 Gson 并为 JSON 创建了自定义实体提供程序。它现在按预期工作,但我会更高兴不自己处理它,而是让容器使用为 JAXB 配置的任何东西来完成它。

【讨论】:

    【解决方案2】:

    你的 JSON,JSON 将被解析成的 Java 类,你的 JAX-RS 资源方法看起来不错:

    {
      "name": "example",
      "properties": {
        "key1": "val1",
        "key2": "val2"
      }
    }
    
    public class Document {
    
        private String name;
        private Map<String, String> properties;
    
        // Getters and setters omitted
    }
    
    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    public Response addDocument(Document document) {
        ...
        return Response.ok(200).build();
    }
    

    您可以考虑使用与 Jersey 集成的 JSON 提供程序,而不是使用您在 answer 中提到的 Gson。 Jackson 是一个不错的选择,Maps 应该可以正常工作。

    有关如何将 Jackson 与 Jersey 一起使用的详细信息,请参阅此answer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-23
      • 2018-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-05
      相关资源
      最近更新 更多