我有一个对象,在REST Web服务(jax-rs)中用作返回类型。该对象包含一个字段,该字段是另一种类型的数组。示例:
@Name("PARAMETER_DEFINITION_TABTYPE")
@TableOfDefinition
@XmlType(
name = "parameter_DEFINITION_TABTYPE"
)
class PARAMETER_DEFINITION_TABTYPE {
@XmlElement(
name = "parameter_definition_rectype",
nillable = true
)
public PARAMETER_DEFINITION_RECTYPE[] ELEMENTS;
@Override
public String toString() {
return ELEMENTS == null ? null : java.util.Arrays.toString(ELEMENTS);
}
}
我使用所有现有的注释来创建我的SOAP Web服务,并且不想触碰类或现有的注释。我创建的REST服务使用相同的类并生成以下json:
{"parameter_definition_rectype": [
{
"name": "abc"
},
{
"name": "abss"
}
]}
我想获得以下输出(基本上忽略外部元素,仅使用“ ELEMENTS”字段):
[
{
"name": "abc"
},
{
"name": "abss"
}
]
当PARAMETER_DEFINITION_TABTYPE嵌套在另一个对象中时,我也想忽略外部对象。 有没有办法通过使用批注来实现这一目标?
谢谢!
答案 0 :(得分:1)
您可以为PARAMETER_DEFINITION_TABTYPE
类定义一个自定义的序列化器和反序列化器,这将改变ObjectMapper
处理它的方式。
这在Wiki Jackson How-To: Custom Serializers
中有解释,如果您不能向PARAMETER_DEFINITION_TABTYPE
类添加新注释,则应使用a custom module。
或多或少下面的代码。这里的问题是,您必须提供许多自定义代码才能获得所需的行为。拥有一个单独的类来表示JSON对象会更清洁,因为它不同于XML对象:
public static void main(String[] args) throws Exception {
SimpleModule module = new SimpleModule("WrapperModule", new Version(1, 0, 0, null));
module.addSerializer(Wrapper.class, new WrapperSerializer(Wrapper.class));
module.addDeserializer(Wrapper.class, new WrapperDeserializer(Wrapper.class));
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(module);
Wrapper in = new Wrapper();
in.elements = new String[]{"a", "b", "c"};
String json = mapper.writeValueAsString(in);
System.out.println(json);
Wrapper out = mapper.readValue(json, Wrapper.class);
System.out.println(Arrays.toString(out.elements));
}
public static class Wrapper {
public String[] elements;
}
public static class WrapperSerializer extends StdSerializer<Wrapper> {
public WrapperSerializer(Class<Wrapper> t) {
super(t);
}
@Override
public void serialize(Wrapper w, JsonGenerator gen, SerializerProvider provider) throws IOException {
provider.defaultSerializeValue(w.elements, gen);
}
}
public static class WrapperDeserializer extends StdDeserializer<Wrapper> {
public WrapperDeserializer(Class<Wrapper> c) {
super(c);
}
@Override
public Wrapper deserialize(JsonParser p, DeserializationContext ctx) throws IOException {
Wrapper w = new Wrapper();
w.elements = ctx.readValue(p, String[].class);
return w;
}
}