当前位置: 首页 > 知识库问答 >
问题:

使用JAX-RS和MOXy的JSON解组

夹谷衡
2023-03-14
public class User {

    private String id;
    private String email;
    private Address address;
    private List<Phone> phones;

    // getters & setters

}
public class Address {

    private String type;
    private String value;

    // getters & setters

}

public class Phone {

    private String type;
    private String value;

    // getters & setters

}
@POST
public Response create(User user) {
   // some logic
}

现在,当我发送包含以下json数据的POST请求时:

{
   "id":"qwe12",
   "email":"emailname@g-mail.com",
   "address":{
      "type":"1WHEN-Honorable",
      "value":"1WHEN-M"
   },
   "phones":[
      {
         "type":"HOME",
         "number":"034-2342-12-31"
      },
      {
         "type":"WORK",
         "number":"31-21-3211-32"
      }
   ]
}

它工作得很好,MOXY会自动将这个json映射到用户对象,很好

但我需要使用另一层嵌套来处理json,如下所示:

{
   "user":{
      "id":"qwe12",
      "email":"emailname@g-mail.com",
      "address":{
         "type":"1WHEN-Honorable",
         "value":"1WHEN-M"
      },
      "phones":[
         {
            "type":"HOME",
            "number":"034-2342-12-31"
         },
         {
            "type":"WORK",
            "number":"31-21-3211-32"
         }
      ]
   }
}
@POST
public Response create(UserWrapper user) {
   // some logic
}
public class UserWrapper {

    private User user;

    // getters & setters

}

共有1个答案

孟昆
2023-03-14

也许不是你要找的答案,但我推荐使用Jackson而不是Moxy。它是一个更成熟的JSON框架,具有更多的特性,而且工作得更好。莫西也许有办法,但这是杰克逊的办法

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>2.22.1</version>
</dependency>
<!-- You need to remember to remove MOXy -->

ContextResolver中,配置ObjectMapper以解包装根值

@Provider
public class MyObjectMapperProvider implements ContextResolver<ObjectMapper> {
    final ObjectMapper mapper;

    public MyObjectMapperProvider() {
        mapper = new ObjectMapper();
        mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
    }

    @Override
    public ObjectMapper getContext(Class<?> type) {
            return defaultObjectMapper;
        }
    }

    private static ObjectMapper createDefaultMapper() {
        return mapper;
    }
}

它将查找以反序列化的值将为

    null
mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true);
 类似资料:
  • 我目前正在尝试使用Glassfish 4(使用Jersery 2.0和EclipseLink 2.5)解构通过REST PUT提供的JSON对象。 JSON对象由多个属性组成,包括映射到Java枚举的字符串值。 除了有效负载中提供了无效的枚举值外,其他一切都正常工作 JSON对象: 被解组为: 如果JSON负载中的值不是有效的Rating,它当前返回null,这似乎是JAXB忽略转换错误的结果(请

  • 我正在尝试创建一个简单的REST api,我遵循了Jersey网站上的教程:https://jersey.java.net/nonav/documentation/2.0/deployment.html 以下是错误: 原因:javax.servlet.unavailableException:org.eclipse.jetty.servlet.baseholder.doStart(basehold

  • 这并没有改变结果,而不是失败(应该失败),帖子仍然得到响应。我知道这些注释仍然需要一个验证器来验证它们。我是(假的?)在Jboss提供这样一个验证器的印象中。

  • webresources定义如下。这个类是由NetBeans自动添加的。

  • JAX-RS是否可以只使用带有注释的Servlet3.0(特别是Tomcat7)来实现,而不必实现另一个Servlet容器? 如果不是,请解释为什么下面这本书中的引用是不正确的,或者是我对它的解释是错误的。 因为此示例部署在Java EE应用程序服务器或独立的Servlet3.x容器中,所以我们只需要一个空的web.xml文件。服务器将检测到某个应用程序类在您的WAR中,并自动部署它。(带有JAX

  • 我在我的Jersey(2.7)项目中使用Moxy,基本上只是为了在服务发出响应时将我的对象整理为JSON。它工作得很好,但现在我也在使用ContainerResponseFilter对发出的每个响应进行一些更改,我不确定如何将请求体的内容解组到一个对象中,这是我需要的。 但我不确定是否有可能将它自动转换为一个对象。我需要的信息比较简单,所以我想我可以用另一种方式解析JSON,但我很好奇。 我试过找