如何从我拥有的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
。我该如何配置?
答案 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输出中的类型是不雅观的。