【问题标题】:JSON to java unmarshelling in JAX-RS returning { } in POST在 POST 中返回 {} 在 JAX-RS 中的 JSON 到 java 解组
【发布时间】:2015-12-01 00:08:37
【问题描述】:

我正在尝试构建一个 JAX-RS rest api,它在 POST 方法中接受一个(JSON)UnMarshelled 类,目前我只返回相同的类(作为 JSON 编回)。

当我返回对象时,我在浏览器(邮递员客户端)中得到一个普通的 {}。我正在使用question: 中提供的数据。

我的理解是否正确,我发送的相同 JSON 应该按原样返回?如果是,则不确定为什么只收到 { } 或者我完全错过了什么。

下面是我的代码:

@Path("/元数据") 公共类 MetadataResource {

//Anil: This is the method that will be called when a post at /metadata comes  
@Consumes(MediaType.APPLICATION_JSON)
@POST
@Produces(MediaType.APPLICATION_JSON)
public ObjectA CreateMetadata_JSON(ObjectA metadata) {

    return metadata;

}

类对象 A:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "objectA")
public class ObjectA {
    @XmlElement(required = true)
    protected String propertyOne;
    @XmlElement(required = true)
    protected String propertyTwo;
    @XmlElement(required = true)
    protected ObjectB objectB;
}

和类对象 B:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "objectB")
public class ObjectB {
    @XmlElement(required = true)
    protected String propertyA;
    @XmlElement(required = true)
    protected boolean propertyB;
}

被发送的json对象是:

{ 
  "objectA" : 
  { 
    "propertyOne" : "some val", 
    "propertyTwo" : "some other val",
    "objectB" : 
    {
      "propertyA" : "some val",
      "propertyB" : "true" 
    }
  }
}

【问题讨论】:

    标签: java json jaxb jax-rs


    【解决方案1】:

    这是因为根对象包装器

    { 
      "objectA" : 
      
    }
    

    一般来说,预期的 JSON 对象就是你所拥有的一切,不包括上面的根值包装器。如果需要完全按照您的方式使用 JSON,则需要将 JSON 提供程序配置为 un-包装根值。如果您不这样做,那么提供程序将无法识别 JSON 中的任何属性,并且您会得到一个带有一堆空值的对象。因此,当您序列化同一个对象时,提供程序会忽略 null,而您会得到一个空的 JSON 对象{ }

    所以简单的解决方案就是使用

    { 
      "propertyOne" : "some val", 
      "propertyTwo" : "some other val",
      "objectB" : 
      {
        "propertyA" : "some val",
        "propertyB" : "true" 
      }
    }
    

    如果您需要根值包装器,那么我需要知道您使用的是什么 JSON 提供程序,然后我才能尝试帮助您配置它以解开根值。


    更新

    对于 MOXy,如果您想将其配置为包裹/解包裹根值,您可以在 MoxyJsonConfig 中将 setIncludeRoot 设置为 true。您需要提供ContextResolver 才能被发现。

    @Provider
    public class MoxyConfigResolver implements ContextResolver<MoxyJsonConfig> {
        
        private final MoxyJsonConfig config;
        
        public MoxyConfigResolver() {
            config = new MoxyJsonConfig();
            config.setIncludeRoot(true);
        }
    
        @Override
        public MoxyJsonConfig getContext(Class<?> type) {
            return config;
        } 
    }
    

    【讨论】:

    • 感谢@peeskillet,这确实起到了作用,并感谢您的解释,只是为了了解我是否必须解开根目录以及我将如何处理它?我假设杰克逊?,我正在使用 curreny &lt;dependency&gt; &lt;groupId&gt;com.googlecode.json-simple&lt;/groupId&gt; &lt;artifactId&gt;json-simple&lt;/artifactId&gt; &lt;version&gt;1.1&lt;/version&gt; &lt;/dependency&gt;
    • 我不认为这是一个 JSON 提供者。它是一个独立的序列化。我不认为这是正在使用的。你有别的事吗?如果没有,服务器可能已经拥有它,这就是正在使用的东西。你用的是什么服务器?
    • 是的,我很确定您还有其他依赖项,但没有意识到它是提供者。您在评论中肯定不是提供者。如果你不使用它,你可以完全摆脱它。
    • 对不起,我是 json 和 jax-rs 部分的新手,所以我想我只是从我的 archtype 项目 &lt;artifactId&gt;jersey-media-moxy&lt;/artifactId&gt; 中取消了对此的注释,所以这是我对 json 提供程序的依赖吗?
    猜你喜欢
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 2012-06-29
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    相关资源
    最近更新 更多