@JsonDeserialize
inside を使用してカスタム アノテーションを作成し、JsonDeserializer
を実装するカスタムを作成できますContextualDeserializer
。このアイデアは、あなたが言及したソリューションから着想を得ていますが、json オブジェクトの任意の 1 つのプロパティをアンラップする方が一般的です。
@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 オブジェクトを逆シリアル化し、注釈付きフィールドにプロパティを抽出します。
編集:
以下は、次の例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());
出力:
【司会・参加者・来場者】
sanjeet@shahanshah