web-services – 杰克逊没有使用JSON根元素

web-services – 杰克逊没有使用JSON根元素,第1张

概述我正在使用JAX-RS Jersey来使用Web服务请求,而Jackson则使用 JSON数据来转换: @Path("/")public class JAXRSRestController { @Path("/jsonRequest") @POST @Consumes(MediaType.APPLICATION_JSON) public Response subm 我正在使用JAX-RS Jersey来使用Web服务请求,而Jackson则使用 JSON数据来转换:

@Path("/")public class JAXRSRestController {    @Path("/JsonRequest")    @POST    @Consumes(MediaType.APPliCATION_JsON)    public Response submitJsonRequest(SampleObject sampleObject,@Context httpheaders headers)    {        Ack ack = new Ack();        ack.setUniqueID(sampleObject.getID());        ack.setType(sampleObject.getname());        return Response.ok().entity(ack).build();    }}

如果请求采用以下格式,则不会消耗:

{  "sampleObject": {    "ID": "12345","name": "somename"  }}

但如果请求采用以下格式,则会被使用:

{    "ID": "12345","name": "somename"}

如何让控制器也使用Json根元素

SampleObject类:

import org.codehaus.jackson.map.annotate.JsonRootname;@XmlRootElement(name = "sampleObject")@JsonRootname(value = "sampleObject")@XmlAccessorType(XmlAccesstype.FIELD)@XmlType(name  = "SampleObject",propOrder = {        "ID","name"})public class SampleObject {    protected String ID;    protected String name;    public SampleObject(){}    public SampleObject(String ID,String name) {        this.ID = ID;        this.name = name;    }    public String getID() {        return ID;    }    public voID setID(String ID) {        this.ID = ID;    }    public String getname() {        return name;    }    public voID setname(String name) {        this.name = name;    }}

web.xml中:

<?xml version="1.0" enCoding= "UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >  <display-name>Wed Application</display-name>  <servlet>    <servlet-name>Jersey RESTFul WebSerivce</servlet-name>    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>    <init-param>        <param-name>com.sun.jersey.config.property.packages</param-name>        <param-value>com.jaxrs.rest</param-value>    </init-param>    <init-param>        <param-name>com.sun.jersey.API.Json.POJOMapPingFeature</param-name>        <param-value>true</param-value>    </init-param>    <load-on-startup>1</load-on-startup>  </servlet>  <servlet-mapping>    <servlet-name>Jersey RESTFul WebSerivce</servlet-name>    <url-pattern>/*</url-pattern>  </servlet-mapping></web-app>
解决方法 我能想到两种方法.如果这在您的应用程序中很常见,我建议您在ObjectMapper上启用解包.如果这是一次性情况,则包装器对象不是一个糟糕的选择.

A.启用展开功能

@JsonRootname仅在ObjectMapper上启用解包时才适用.您可以使用反序列化功能完成此 *** 作.请注意,这将解包所有请求:

public CustomObjectMapper() {   super();   enable(DeserializationFeature.UNWRAP_ROOT_VALUE);}

如果您还没有注册自定义ObjectMapper,那么您需要添加一个provider以使用Jersey注册自定义配置. This answer解释了如何实现这一目标.

B.创建一个包装器

如果您不想全局展开,可以创建一个简单的包装器对象并省略@JsonRootname注释:

public class SampleObjectWrapper {   public SampleObject sampleObject;}

然后更新您的资源方法签名以接受包装器:

public Response submitJsonRequest(SampleObjectWrapper sampleObjectWrapper,@Context httpheaders headers)
总结

以上是内存溢出为你收集整理的web-services – 杰克逊没有使用JSON根元素全部内容,希望文章能够帮你解决web-services – 杰克逊没有使用JSON根元素所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1077908.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存