Ho bisogno di configurare Jackson in un modo specifico che descriverò di seguito.Come (De) serializzare il campo dall'oggetto in base all'annotazione usando Jackson?
Requisiti
- campi segnalate siano serializzati con solo il loro ID:
- Se il campo è un oggetto normale, serializzare il suo
id
- Se il campo è un insieme di oggetti, serializzare un matrice di
- Se il campo è un oggetto normale, serializzare il suo
- I campi annotati ottengono i loro nomi di proprietà serializzati diversamente:
- Se il campo è un oggetto normale, aggiungi
"_id"
suffisso al nome della proprietà - Se il campo è una collezione di oggetti, aggiungere
"_ids"
suffisso al nome della proprietà
- Se il campo è un oggetto normale, aggiungi
- Per l'annotazione ero pensando qualcosa di simile a un costume
@JsonId
, idealmente con un valore opzionale per sovrascrivere il nome proprio come fa@JsonProperty
- la proprietà ID dovrebbe essere definito dall'utente, sia usando:
- Il già esistente di Jackson
@JsonIdentityInfo
- o creando un'altra classe o di un campo di annotazione
- o decidendo che l'annotazione ispezionare per
id
proprietà reperibilità (utile per gli scenari di JPA, per esempio)
- Il già esistente di Jackson
- oggetti deve essere serializzato con un valore radice incapsulato
- La denominazione del caso Camel deve essere convertita in minuscolo con trattini bassi
- Tutto ciò deve essere deseri alizable (costruendo un'istanza con solo l'id impostato)
Un esempio
Considerando di questi POJO:
//Inform Jackson which property is the id
@JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "id"
)
public abstract class BaseResource{
protected Long id;
//getters and setters
}
public class Resource extends BaseResource{
private String name;
@JsonId
private SubResource subResource;
@JsonId
private List<SubResource> subResources;
//getters and setters
}
public class SubResource extends BaseResource{
private String value;
//getters and setters
}
Una possibile serializzazione di un'istanza Resource
potrebbe essere:
{
"resource":{
"id": 1,
"name": "bla",
"sub_resource_id": 2,
"sub_resource_ids": [
1,
2,
3
]
}
}
Finora ...
Requisito # 5 può essere realizzato configurando
ObjectMapper
nel seguente modo:objectMapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true); objectMapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true);
E quindi utilizzando
@JsonRootName("example_root_name_here")
nel mio POJO di.Requisito # 6 può essere realizzato configurando
ObjectMapper
nel seguente modo:objectMapper.setPropertyNamingStrategy( PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
Come potete vedere ci sono ancora un sacco di requisiti da soddisfare. Per quelli che si chiedono perché ho bisogno di una tale configurazione, è perché sto sviluppando un webservice REST per ember.js (più specificamente Dati di bordo). Apprezzeremmo molto se potessi aiutare con uno qualsiasi dei requisiti.
Grazie!
come è stata l'esperienza? Sono esattamente di fronte a questi requisiti ora. Se potessi fornire le tue decisioni di configurazione, sarebbe molto apprezzato. Grazie – beku8
hai cercato di creare il tuo 'AnnotationIntrospector'? –
Devo anche interagire con i dati di brace. Ho visto nuove versioni di Jackson fornire funzionalità per facilitare questo. Qual è stata la tua soluzione? post scriptum Sto esaminando la risposta approvata per l'intuizione. – ieugen