我有一个对象用作 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 嵌套在另一个对象中时,我还想忽略外部对象。 有没有一种方法可以通过使用注释来实现?
谢谢!
最佳答案
您可以为 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;
}
}
关于java - jackson 转发属性而不是外部对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53886234/