您可以使用以下命令创建自定义注释@JsonDeserialize
里面并创建一个自定义JsonDeserializer
实现ContextualDeserializer
。这个想法的灵感来自解决方案 https://stackoverflow.com/questions/11747370/jackson-how-to-process-deserialize-nested-json/17312719#17312719您提到过,但更常见的是解包 json 对象中的任何一个属性。
以下是使用的自定义注释@JacksonAnnotationsInside
作为注释容器包含@JsonDeserialize
:
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonDeserialize(using = JsonUnwrapPropertyDeserializer.class)
public @interface JsonUnwrapProperty {
}
和习俗JsonDeserializer
实现ContextualDeserializer
:
public class JsonUnwrapPropertyDeserializer extends JsonDeserializer<Object> implements ContextualDeserializer {
private JavaType unwrappedJavaType;
private String unwrappedProperty;
@Override
public JsonDeserializer<?> createContextual(final DeserializationContext deserializationContext, final BeanProperty beanProperty) throws JsonMappingException {
unwrappedProperty = beanProperty.getMember().getName();
unwrappedJavaType = beanProperty.getType();
return this;
}
@Override
public Object deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException {
final TreeNode targetObjectNode = jsonParser.readValueAsTree().get(unwrappedProperty);
return jsonParser.getCodec().readValue(targetObjectNode.traverse(), unwrappedJavaType);
}
}
和使用示例:
public class MyBean {
@JsonProperty("broadcastPresenceRoles")
@JsonUnwrapProperty
private List<String> broadcastPresenceRole;
@JsonProperty("admins")
@JsonUnwrapProperty
private String admin;
// constructor, getter and setter
}
@JsonProperty
是找到包装对象并且@JsonUnwrappProperty
就是反序列化json对象,提取一个属性到带注释的字段中。
Edited:
以下是一个示例ObjectMapper
:
String json = "{\n" +
" \"broadcastPresenceRoles\": {\n" +
" \"broadcastPresenceRole\": [\n" +
" \"moderator\",\n" +
" \"participant\",\n" +
" \"visitor\"\n" +
" ]\n" +
" },\n" +
" \"admins\": {\n" +
" \"admin\": \"sanjeet@shahanshah\"\n" +
" }\n" +
"}";
final ObjectMapper mapper = new ObjectMapper();
final MyBean myBean = mapper.readValue(json, MyBean.class);
System.out.println(myBean.getBroadcastPresenceRole());
System.out.println(myBean.getAdmin());
Output:
[主持人、参与者、访客]
sanjeet@shahanshah