2012-09-14 10 views
20

Penso di aver bisogno di creare uno specialista ObjectMapper e non riesco a trovare alcun codice di esempio per avviare il processo.Cambia caso di campo con un ObjectMapper

Il creatore del JSON utilizza le proprietà .Net e public e pertanto utilizza i nomi dei campi con iniziale maiuscola. Sto analizzando il JSON in POJOs, quindi mi piacerebbe usare una iniziale minuscola.

Alla loro estremità:

public class Facet 
    { 
     public string Name { get; set; } 
     public string Value { get; set; } 
    } 

Alla mia fine ho quindi devono avere:

public class Facet { 
     public String Name; 
     public String Value; 
    } 

io preferirei di gran lunga:

public class Facet { 
     public String name; 
     public String value; 
    } 

ho ragione che questo potrebbe essere fatto con un ObjectMapper?

+1

Ho retitled e rimosso la seconda parte della questione. L'altra metà è pubblicata [qui] (http://stackoverflow.com/q/12450404/823393) – OldCurmudgeon

risposta

23

La tua prima questione può essere affrontata in modo molto semplice con la @JsonProperty della nota:

// java-side class 
public class Facet 
{ 
    @JsonProperty("Name") 
    public String name; 

    @JsonProperty("Value") 
    public String value; 
} 

Ora il ObjectMapper corrisponderà i nomi dei campi in modo diverso-carter. Se non si desidera aggiungere annotazioni nelle vostre classi, è possibile creare una classe Mix-in per stand per la vostra Facet:

public class FacetMixIn 
{ 
    @JsonProperty("Name") 
    public String name; 

    @JsonProperty("Value") 
    public String value; 
} 

objectMapper.getDeserializationConfig().addMixInAnnotations(Facet.class, FacetMixIn.class); 

Questo sarà ottenere la stessa cosa, senza richiedere annotazioni aggiuntive nel Facet classe.

+0

Questo è esattamente quello che stavo cercando nella parte 1 :) Grazie. Ho aggiunto alla parte 2. Questo rende tutto più semplice? – OldCurmudgeon

+0

Ho diviso la domanda originale in due ora quindi questa è ora una risposta completa. Con ogni mezzo modificare per riflettere il cambiamento nella domanda. – OldCurmudgeon

14

Invece di annotare ogni campo, è possibile configurare Jackson ObjectMapper per l'utilizzo di uno standard integrato o personalizzato PropertyNamingStrategy, per applicare una traduzione coerente tra i nomi di campi/proprietà Java e nomi di elementi JSON.

Ad esempio:

myObjectMapper.setPropertyNamingStrategy(PascalCaseStrategy); 
+0

Grazie a @ProgrammerBruce per ulteriore assistenza. Controllerò che funzioni quando torno a lavoro più tardi nel nuovo anno. A proposito, c'è una strategia che si abbinerà a QUALSIASI caso? Se no, forse potresti pubblicarne uno. Sto cercando di trattare con un cliente che potrebbe cambiare le loro convenzioni in qualsiasi momento. – OldCurmudgeon

+0

Ultimo sguardo (circa un anno fa), le traduzioni dei nomi vanno solo in una direzione (dalla proprietà Java/nomi dei campi ai nomi degli elementi JSON, o viceversa), e quindi l'implementazione della corrispondenza senza distinzione tra maiuscole e minuscole non era banale come altrimenti potrebbe essere. –

+0

@Jose: Sono cose diverse. SnakeCaseStrategy è per "snake_case_variables" – dagnelies

5

Questo problema potrebbe essere risolto da Jackson 2.5.0 simili:

ObjectMapper mapper = new ObjectMapper(); 
mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true); 

Dal javadoc:

com.fasterxml.jackson.databind.MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES

Funzione che consentirà una deserializzazione più tollerante del JSON in entrata . Se abilitato, le proprietà del bean verranno abbinate usando gli equivalenti in minuscolo , il che significa che qualsiasi combinazione di casi (in arrivo e nomi corrispondenti sono canonizzati da una parte inferiore) dovrebbe funzionare.

Si noti che è necessario un overhead aggiuntivo delle prestazioni poiché i nomi delle proprietà in ingresso devono essere ridotte prima del confronto, per i casi in cui sono presenti lettere maiuscole. L'overhead per i nomi che sono già minuscolo dovrebbe essere tuttavia trascurabile.

La funzionalità è disabilitata per impostazione predefinita.

Dal: 2,5

Problemi correlati