从JSON输出泽西moxy中删除“type”

时间:2014-01-13 12:21:12

标签: java json jersey marshalling moxy

如何从我拥有的JSON输出中删除type。我有一个包含REST服务输出的类/ bean。我正在使用jersey-media-moxy进行转换。

服务

@Resource
public interface MyBeanResource
{
    @GET
    @Path("/example")
    @Produces( MediaType.APPLICATION_JSON )
    public Bean getBean();
}

The Bean

@XmlRootElement
class Bean
{
   String a;
}  

我想添加一些功能(用于使用构造函数初始化bean)

class BeanImpl extends Bean
{
    BeanImpl(OtherClass c)
    {
        a = c.toString()
    }
}

输出的JSON是:

{type:"beanImpl", a:"somevalue"}

我不希望我的JSON中有type。我该如何配置?

5 个答案:

答案 0 :(得分:15)

当我扩展一个类并生成JSON时,我得到了同样的错误 - 但仅限于顶级(根)类。作为解决方法,我使用@XmlType(name="")注释我的子类,这可以防止生成的type属性出现在我的JSON中。

Blaise,我不确定为什么会这样。有什么想法吗?

答案 1 :(得分:2)

MOXy将添加一个类型指示符来区分不同的子类型。但是,只有当MOXy知道子类型时才会发生这种情况(默认情况下不是这样)。

演示代码

<强>演示

以下是Jersey将在MOXy上调用的等效代码。

import org.eclipse.persistence.jaxb.rs.MOXyJsonProvider;

public class Demo {

    public static void main(String[] args) throws Exception {
        MOXyJsonProvider mjp = new MOXyJsonProvider();

        BeanImpl beanImpl = new BeanImpl(new OtherClass());
        mjp.writeTo(beanImpl, Bean.class, Bean.class, null, null, null, System.out);

    }

}

<强>输出

{}

可能的问题?

您的真实@XmlSeeAlso课程中是否有Bean注释?

import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlSeeAlso(BeanImpl.class)
class Bean
{
   String a;
}  

然后输出将是(假设BeanImpl也有一个无参数构造函数):

{"type":"beanImpl"}

答案 2 :(得分:1)

您可以构建自定义邮件正文编写器。

@Provider
@Produces({
   MediaType.APPLICATION_JSON
})
public class BeanBodyWriter implements MessageBodyWriter<Bean> {

    @Override
    public long getSize(Bean t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
        // Called before isWriteable by Jersey. Return -1 if you don't the size yet. 
        return -1;
    }

    @Override
    public boolean isWriteable(Class<?> clazz, Type genericType, Annotation[] annotations, MediaType mediaType) {
        // Check that the passed class by Jersey can be handled by our message body writer
        return Bean.class.isAssignableFrom(clazz);
    }

    @Override
    public void writeTo(Bean t, Class<?> clazz, Type genericType, Annotation[] annotations, MediaType mediaType,
            MultivaluedMap<String, Object> httpHeaders, OutputStream out) throws IOException, WebApplicationException {

        // Call your favorite JSON library to generate the JSON code and remove the unwanted fields...
        String json = "...";

        out.write(json.getBytes("UTF-8"));
    }
}

答案 3 :(得分:0)

使用它来生成JSON,你不会遇到这个问题:

<dependency>
    <groupId>com.fasterxml.jackson.jaxrs</groupId>
    <artifactId>jackson-jaxrs-json-provider</artifactId>
    <version>2.3.3</version>
</dependency>

答案 4 :(得分:0)

我在一个稍微不同的情况下使用了泽西特有的杰克逊包,它有效。详细配置在Jersy document中描述。在我的例子中,我在@XmlRootElement类中使用了泛型类型字段。 MOXy在JSON输出中添加了一个类型。我明白为什么MOXy会这样做。如果需要将JSON输出解组回Java对象,则MOXy需要知道要创建正确对象的类型。但是,就我而言,JSON输出中的类型是不雅观的。